PHP/MySQL奇怪的问题,仅当用户登录时影响从数据库获取
所以我有一个函数,它从数据库中获取数据并对其进行响应。该函数从数据库中获取文章id、文章标题和其他一些数据 当用户未登录时,该函数工作正常并显示所有数据,但当用户登录时,突然只获取文章标题。。所有数据都在同一个数据库中,甚至在同一个表中,但只获取项目id 注:PHP/MySQL奇怪的问题,仅当用户登录时影响从数据库获取,php,mysql,session,localhost,Php,Mysql,Session,Localhost,所以我有一个函数,它从数据库中获取数据并对其进行响应。该函数从数据库中获取文章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;
}
}
我可以