mysql只返回带有数值的结果

时间:2017-12-08 21:29:02

标签: php mysql

我正在为公共访问类别创建一个随机字母数字,只能通过在url链接中使用此字母数字的post id找到。奇怪的是,我只在使用数值时从查询中获得结果。

 $sql = "SELECT *
 FROM $a
 WHERE access_key = $category_id

我得到一个“未知列”错误,其中包含alphnumeric数据作为列,我觉得有点奇怪。我认为这可能是一些简单的事情,比如逃避需要做的事情,但我并不确定。

任何建议都会得到满足。提前谢谢。

2 个答案:

答案 0 :(得分:2)

这是正确的方法,也可以解决您所看到的错误。

的mysqli:

// assuming $a is already safe
$stmt = $mysqli->prepare('SELECT * FROM '. $a .' WHERE access_key = ?');
$stmt->bind_param('s', $category_id);
$stmt->execute();

PDO:

// assuming $a is already safe
$stmt = $pdo->prepare('SELECT * FROM '. $a .' WHERE access_key = :category_id');
$stmt->execute(array(':category_id'=>$category_id));

至于白名单......这是一个基本的例子(在任何sql操作之前都这样做):

$safe = array('categorytable','usertable');
if (!in_array($a,$safe)) { return; exit; die(); /*lol*/ }

ORRRRR ....如果您只是想快速修复当前的sql代码行(但请考虑将来做好准备):

$sql = "SELECT *
        FROM $a
        WHERE access_key = '$category_id'";

答案 1 :(得分:0)

如tadman所述,永远不要在SQL中使用直接的$ _GET或$ _POST值。用这样的东西保护它:

boolean

由于你没有在撇号中包装你的价值,MySQL认为它是一个专栏。所以,写下这样的东西:

Function protectSQL($val, $type=‘text’) {
$val = get_magic_quotes_gpc() ? stripslashes($val) : $val;
switch ($type) {
    case "text":
         $val = ($val != "") ? "'" . $val . "'" : "NULL";
         break;
    case "long":
    case "int":
         $val = ($val != "") ? intval($val) : "NULL";
         break;
      }
return $val;
}

你会得到像以下一样干净的东西:

$sql = sprintf("SELECT * FROM %s WHERE access_key = %s", $a, protectSQL($val)); // $val is passed in the functions above, and $a has to be guaranteed...

请记住,$ a假定来自您的代码,因此没有添加任何保护。如果它来自客户端,则一个简单的in_array命令可以确保它是一个有效的表。