Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MySQL奇怪的问题,仅当用户登录时影响从数据库获取_Php_Mysql_Session_Localhost - Fatal编程技术网

PHP/MySQL奇怪的问题,仅当用户登录时影响从数据库获取

PHP/MySQL奇怪的问题,仅当用户登录时影响从数据库获取,php,mysql,session,localhost,Php,Mysql,Session,Localhost,所以我有一个函数,它从数据库中获取数据并对其进行响应。该函数从数据库中获取文章id、文章标题和其他一些数据 当用户未登录时,该函数工作正常并显示所有数据,但当用户登录时,突然只获取文章标题。。所有数据都在同一个数据库中,甚至在同一个表中,但只获取项目id 注: 在我的本地主机中,这不会发生 我的主机是ipage.com,为了让php会话正常工作,我需要在session\u start()之前添加session\u save\u path(//path)(我不知道这是否与问题有关) 更新: 这是错

所以我有一个函数,它从数据库中获取数据并对其进行响应。该函数从数据库中获取文章id、文章标题和其他一些数据

当用户未登录时,该函数工作正常并显示所有数据,但当用户登录时,突然只获取文章标题。。所有数据都在同一个数据库中,甚至在同一个表中,但只获取项目id

注:

  • 在我的本地主机中,这不会发生
  • 我的主机是ipage.com,为了让php会话正常工作,我需要在session\u start()之前添加session\u save\u path(//path)(我不知道这是否与问题有关)
  • 更新:

    这是错误:
    警告:内爆()[函数.内爆]:在/path中传递的参数无效

    这就是功能:

    function getNowPlaying($stmt) {
    
        $sql = 'SELECT movies.imdbID, movies.title FROM movies ORDER BY Rand() LIMIT 15';
        if ($stmt->prepare($sql)) {
            $stmt->bind_result($imdbID, $title);
            $stmt->execute();
            $i = 0;
            while ($stmt->fetch()) {
                $data[$i]["imdb"] = zeroFill($imdbID);
                $data[$i]["title"] = $title;
                $i++;
            }
        }
    
        for ($i = 0; $i < count($data); $i++) {
    
            $genres = getGenre($stmt, $data[$i]["imdb"]);
            $data[$i]["genre"] = implode(', ', $genres);
    
            $data[$i]["poster"] = getPoster($stmt, $data[$i]["imdb"]);
        }
    
        return $data;
    }
    
    function getGenre ($stmt, $id, $db = 'main') {
    
        if ($db === 'main') {
        $sql = 'SELECT sys_genres.genre FROM sys_genres, movie_genres WHERE sys_genres.genreID = movie_genres.genreID AND movie_genres.imdbID = ?
            ORDER BY movie_genres.genreORDER';
        }
    
        else if ($db === 'inp') {
        $sql = 'SELECT sys_genres.genre FROM sys_genres, inp_movie_genres WHERE sys_genres.genreID = inp_movie_genres.genreID AND inp_movie_genres.imdbID = ?
            ORDER BY inp_movie_genres.genreORDER';
        }
    
        if ($stmt->prepare($sql)) {
        $stmt->bind_param('i', $id);
        $stmt->bind_result($genres);
        $stmt->execute();
    
        while ($stmt->fetch()) {
            $data[] = $genres;
        }
        }
    
        if (!empty($data)) {
        return $data;
        }
    }
    
    更新2:

    这是导致问题的部分:

    在index.php中,我有以下内容:

    if (isset($_SESSION['userID'])) {
        $user_points = getUserPoints($stmt, $_SESSION['userID']);
    }
    
    
    function getUserPoints($stmt, $userid) {
    
        $sql = 'SELECT points FROM user_points WHERE userID = ? LIMIT 1';
    
        if ($stmt->prepare($sql)) {
            $stmt->bind_param('i', $userid);
            $stmt->bind_result($data);
            $stmt->execute();
            $stmt->fetch();
        }
    
        if (!empty($data)) {
            return $data;
        }
    
    }
    
    当用户登录时,这部分代码会导致问题。。
    有什么想法吗?

    您的代码中没有任何建议与会话相关,但请注意,
    getgreen
    可能返回结果,也可能不返回结果。当
    getgreen
    不返回任何内容时,调用
    内爆
    将做什么还不清楚。这个警告会告诉我,你没有得到任何类型的回复

    使用我可以复制您的警告:

    function foo(){ }
    $bar = foo();
    echo implode(', ', $bar);
    
    发出警告

    警告:内爆():传入的参数无效

    这会让我相信你的问题是发生在链条的更上游…也就是说你观察到的是症状而不是问题

    显然,核心问题是您传递的是
    $stmt
    ,而不是连接本身。您看到的问题源于仅在用户登录时运行的代码。这并不意味着您的登录方案有问题,它与会话完全无关。核心问题是,当用户登录时,您正在做一些通常不使用
    $stmt
    的事情,实际上会破坏它


    无论你在哪里传递
    $stmt
    你都应该传递你的连接
    $conn
    (从你上面的评论我知道这是
    $conn
    )。然后,在需要语句的任何地方,通过运行
    $stmt=$conn->stmt_init()从连接获取一条语句

    代码中没有任何内容表明与会话相关,但请注意,
    getgreen
    可能返回结果,也可能不返回结果。当
    getgreen
    不返回任何内容时,调用
    内爆
    将做什么还不清楚。这个警告会告诉我,你没有得到任何类型的回复

    使用我可以复制您的警告:

    function foo(){ }
    $bar = foo();
    echo implode(', ', $bar);
    
    发出警告

    警告:内爆():传入的参数无效

    这会让我相信你的问题是发生在链条的更上游…也就是说你观察到的是症状而不是问题

    显然,核心问题是您传递的是
    $stmt
    ,而不是连接本身。您看到的问题源于仅在用户登录时运行的代码。这并不意味着您的登录方案有问题,它与会话完全无关。核心问题是,当用户登录时,您正在做一些通常不使用
    $stmt
    的事情,实际上会破坏它


    无论你在哪里传递
    $stmt
    你都应该传递你的连接
    $conn
    (从你上面的评论我知道这是
    $conn
    )。然后,在需要语句的任何地方,通过运行
    $stmt=$conn->stmt_init()从连接获取一条语句

    我不明白为什么当用户登录时这不起作用,但是代码中有一些问题。见我的评论:

    function getNowPlaying($stmt) {
    
        $sql = 'SELECT movies.imdbID, movies.title FROM movies ORDER BY Rand() LIMIT 15';
        if ($stmt->prepare($sql)) {
            $stmt->bind_result($imdbID, $title);
            $stmt->execute();
            $i = 0;
            while ($stmt->fetch()) {
                // BAD place to declare $data...what happens if this is **never** executed?
                // $data should be declared outside of the conditional/loop, since you go on to use it after the conditional/loop
                $data[$i]["imdb"] = zeroFill($imdbID);
                $data[$i]["title"] = $title;
                $i++;
            }
        }
    
        // you should just store count($data) in variable before the for loop, instead of calling count on every iteration of the loop, the size of the array shouldn't change
        for ($i = 0; $i < count($data); $i++) {
    
            $genres = getGenre($stmt, $data[$i]["imdb"]);
            $data[$i]["genre"] = implode(', ', $genres);
            $data[$i]["poster"] = getPoster($stmt, $data[$i]["imdb"]);
        }
    
        return $data;
    }
    
    function getGenre ($stmt, $id, $db = 'main') {
    
        // what happens if $db is neither 'main' nor 'inp'?
        if ($db === 'main') {
        $sql = 'SELECT sys_genres.genre FROM sys_genres, movie_genres WHERE sys_genres.genreID = movie_genres.genreID AND movie_genres.imdbID = ?
            ORDER BY movie_genres.genreORDER';
        }
    
        else if ($db === 'inp') {
        $sql = 'SELECT sys_genres.genre FROM sys_genres, inp_movie_genres WHERE sys_genres.genreID = inp_movie_genres.genreID AND inp_movie_genres.imdbID = ?
            ORDER BY inp_movie_genres.genreORDER';
        }
    
        if ($stmt->prepare($sql)) {
        $stmt->bind_param('i', $id);
        $stmt->bind_result($genres);
        $stmt->execute();
    
        while ($stmt->fetch()) {
            // again, declaring variables inside conditionals/loops is bad if you're using those variables outside of the conditional/loop
            $data[] = $genres;
        }
        }
    
        // and if $data is empty? then what?
        // specific to that error, if you don't return an array, implode() fails
        if (!empty($data)) {
        return $data;
        }
    }
    
    函数getNowPlaying($stmt){ $sql='SELECT movies.imdbID,movies.title FROM movies ORDER BY Rand()LIMIT 15'; 如果($stmt->prepare($sql)){ $stmt->bind_result($imdbID,$title); $stmt->execute(); $i=0; 而($stmt->fetch()){ //声明$data的位置不好…如果**从未**执行,会发生什么? //$data应该在条件/循环之外声明,因为您在条件/循环之后继续使用它 $data[$i][“imdb”]=zeroFill($imdbID); $data[$i][“title”]=$title; $i++; } } //您应该在for循环之前将count($data)存储在变量中,而不是在循环的每次迭代中调用count,数组的大小不应该改变 对于($i=0;$iprepare($sql)){ $stmt->bind_参数('i',$id); $stmt->bind_结果($genres); $stmt->execute(); 而($stmt->fetch()){ //同样,如果在条件/循环之外使用这些变量,那么在条件/循环内声明变量是不好的 $data[]=$genres; } } //如果$data是空的,那又怎样? //特定于该错误,如果不返回数组,则内爆()将失败 如果(!空($data)){ 返回$data; } }
    我可以