PHP可以工作,但会出现SQL语法错误。

3

我刚刚编写了这段代码,它能够输出预期的内容,但在输出语句之后,它给了我一个错误信息 -

您的SQL语法有误,请检查与您的MySQL服务器版本对应的手册,以获取正确的语法使用方法,在第1行附近。

为什么会发生这种情况?如何解决?

<?php
$myclasses = explode(',', $_SESSION['classlist']);  
$theirclasses = explode(',', $user_info['classlist']);
$common_classes = array_intersect($myclasses, $theirclasses);

if (count($common_classes) > 0) {     

    foreach ($common_classes as $class) {
        $classes = mysql_query("SELECT * FROM classes WHERE class_id = ".$class) or die(mysql_error());
        while($currentRow = mysql_fetch_array($classes)){
        echo $currentRow['class_name'];
        }
    }  
}
else {
}

?>

似乎$common_classes中有一个空值。 - lafor
如果 $common_classes 已经检查为空,那么就不应该进入 foreach 循环。请返回已翻译的文本。 - ariefbayu
主要原因是变量 $class 是空的。所以在 $user_info['classlist'] 中有一些 ",," - Luca Rainone
给出的答案可行。只是一个简单的错误。非常感谢大家。请原谅我的判断力不足。 - ramr
3个回答

2

尝试用引号将查询括起来:

$classes = mysql_query("SELECT * FROM classes WHERE class_id = '".$class."'") or die(mysql_error());

或者使用PDO彻底更改您的查询。因为mysql_*函数已经被弃用。


我还需要再等五分钟! - ramr
哈哈,我知道了。这只是一个提醒而已。我看到你的接受率低于75%。 - ariefbayu

0
我会假设当传递到查询时,$class 变量中有问题。在这种情况下,我通常将 SQL 查询分配给一个字符串变量,并将其转储以一次性测试整个查询。这有助于我找出 SQL 语法错误或是否存在任何不需要的字符。
<?php
$myclasses = explode(',', $_SESSION['classlist']);  
$theirclasses = explode(',', $user_info['classlist']);
$common_classes = array_intersect($myclasses, $theirclasses);

if (count($common_classes) > 0) {     

    foreach ($common_classes as $class) {
        $sql = "SELECT * FROM classes WHERE class_id = '{$class}'" ; // use {} inside double quotes
        var_dump($sql); // check out the what the query becomes 
        $classes = mysql_query($sql) or die(mysql_error());
        while($currentRow = mysql_fetch_array($classes)){
        echo $currentRow['class_name'];
        }
    }  
}
else {
}

-1
如果$class为空,你会得到一个错误,这将使你的查询变成SELECT * FROM classes WHERE class_id =,这是无效的。尝试加引号。如果你加了引号,至少你会得到SELECT * FROM classes WHERE class_id = ''
"SELECT * FROM classes WHERE class_id = '".$class."'";

不要这样做。这是一个极其hacky的解决方案,实际上并不能解决问题,即$class没有被正确检查。在运行任何SQL之前,您应该验证$class是否为有效的整数。此外,这将触发类型转换,这是让MySQL无缘无故地工作的好方法。 - Chris Henry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接