where子句中的未知列,但我已经验证过

时间:2013-02-17 18:15:00

标签: php mysql mysqli

我正在努力解决这个简单的SQL行......

运行它会一直给我错误:Error: Unknown column 'comics' in 'where clause'

这通常是一个简单的修复...只需检查以确保“漫画”作为“table_name”列中的条目存在。但我已经检查了......

enter image description here

我的SQL没有看错:

$sql = "SELECT ip FROM votes WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND table_name = $table AND imgid = $imgid";

编辑:

是的,我已经用引号尝试了它:

    $sql = "SELECT ip FROM votes WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND table_name = '$table' AND imgid = $imgid";

但是这会引发错误:

Fatal error: Call to undefined method mysqli_result::num_rows() in C:\wamp\www\HTwS\scripts\likecounter.php on line 40

有人可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

table_name的值是一个字符串,因此必须在查询中单引号。如果没有将其作为字符串值引用,MySQL会假定提供的不带引号的$table是列标识符。

$sql = "SELECT ip FROM votes WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND table_name = '$table' AND imgid = $imgid";
//------------------------------------------------------------------------------------^^^^^^^^^

如果$imgid也是非数字值,您也需要引用该值。

我们假设它已经针对SQL注入进行了正确过滤,如果它是用户输入的结果。我会注意到,由于更新包含特定于MySQLi的代码,所以你真的应该这样做as a prepared statement而不是对mysqli::query()的构造字符串调用。

// Recommended to do this with  a prepared statement.
$stmt = $mysqli->prepare("SELECT ip FROM votes WHERE ip = ? AND table_name = ? AND imgid = ?");
if ($stmt) {
  $stmt->bind_param('ssi', $_SERVER['REMOTE_ADDR'], $table, $imgid);
  $stmt->execute();
  // Bind results, fetch, etc...
}

在问题更新和评论后编辑:

  

调用未定义的方法mysqli_result :: num_rows()

错误消息表示您尝试使用num_rows而不是属性访问MySQLi结果属性()作为方法调用。你应该使用:

$result->num_rows

...而不是

$result->num_rows()