mysqli准备的声明不正常

时间:2014-02-21 20:35:44

标签: php prepared-statement

我正在将此查询转换为准备好的语句:

        $stmt = "SELECT * FROM `table` WHERE col1 ='". $var1. "' and col2 = '".$var2."' and col3 ='".$var3."'";
        $result = mysqli_query($db, $stmt);
        $item_row=mysqli_fetch_row($result);

结果我回显了item_row[1]item_row[2]等。这很好。

这是我已经准备好的声明,但它不起作用:

    $stmt = $db->prepare("SELECT * FROM `table` WHERE col1 = ? and col2 = ? and col3 =?");          
            $stmt->bind_param("sss", $var1,$var2,$var3);
            $stmt->execute();
            while ($item_row = $stmt->fetch()) {
            print_r($item_row);     // prints: 1
            var_dump($item_row);    // prints: bool(true)
            }

我尝试过使用How can I prevent SQL injection in PHP?中的代码,但它打破了整个页面。

我也阅读并尝试过How can I prevent SQL injection in PHP?的例子,但都没有用。上面的例子是我得到的最远的。

任何想法我需要做什么?

2 个答案:

答案 0 :(得分:1)

试试这个:在一个数组中整齐地返回所有数据的方法: 还要确保要获取的列的名称是正确的。

$meta = $stmt->result_metadata();

while ($field = $meta->fetch_field()) {
  $parameters[] = &$row[$field->name];
}

call_user_func_array(array($stmt, 'bind_result'), $parameters);

while ($stmt->fetch()) {
  foreach($row as $key => $val) {
    $x[$key] = $val;
  }
  $results[] = $x;
}

答案 1 :(得分:1)

您是否尝试将结果绑定到变量?

$stmt = $db->prepare("SELECT col1, col2, col3 FROM `table` WHERE col1 = ? and col2 = ? and col3 =?");
$stmt->bind_param("sss", $var1, $var2, $var3);
$stmt->execute();
$stmt->bind_result($col1, $col2, $col3);
while ($stmt->fetch()) {
    echo "$col1 $col2 $col3<br/>";
}

PDO更直观,看起来像这样:

//assuming $db is a PDO object
$stmt = $db->prepare("SELECT col1, col2, col3 FROM `table` WHERE col1 = ? and col2 = ? and col3 =?");
$params = array($var1, $var2, $var3);
$stmt->execute($params);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($rows);