【问题标题】:msyqli prepared statement not working rightmysqli 准备好的语句不能正常工作
【发布时间】:2014-02-21 20:35:43
【问题描述】:

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

        $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? 的示例,但没有任何效果。上面的例子是我得到的最远的。

任何想法我需要做什么?

【问题讨论】:

  • 您的 PDO 语句中的列名错误,您需要使用 col1col2col3,就像在第一个语句中一样。
  • 我更改了名称以使其更易于阅读。他们确实匹配。如果是这样的话,我想我不会得到bool(true)

标签: php prepared-statement


【解决方案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;
}

【讨论】:

  • 名称匹配,我只是在这里复制错误。这段代码会出现在$stmt->execute(); 之后吗?
  • 在 execute() 之后,因为它绑定了结果。
  • 这只是我想要的工作方式。但是我怎样才能回显$x[5]?我可以回显$x[the_column_name],但另一个不做任何事情。
  • 您的回答以及php.net/manual/en/mysqli-stmt.bind-result.php#85470 帮助我找到了解决方案
【解决方案2】:

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

$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);

【讨论】:

  • 这似乎是正确的方向.. 但我需要SELECT * 这样我才能回显类似item_row[5] 的内容(如我的第一个示例所示)。我怎样才能绑定*?像$stmt-&gt;bind_result($item_row[]); 这样的东西。明白我的意思了吗?
  • 我想这是使用 PDO 而不是 mysqli 的另一个原因。您可以跳过结果绑定并将其直接转储到数组中。如果您坚持使用 mysqli,则只需绑定与列一样多的变量。
  • 第一次感谢您的回复。你的回答帮助我朝着我需要的方向前进。但在爱德华的回答中,我可以回显$parameter[1]parameter[2] 等。我相信我找到了他的答案并使用了这个:php.net/manual/en/mysqli-stmt.bind-result.php#85470
  • 是的,call_user_func_array() 的用法肯定很有趣。不过,我鼓励您进一步调查 PDO。在进行查询时不必担心计算问号和处理诸如“sssiissi”之类的东西真是太好了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
相关资源
最近更新 更多