如何在MySqli预处理语句中使用带引号的字符串变量?

时间:2014-02-18 20:44:22

标签: php mysql mysqli

很抱歉,如果这似乎是一个非常愚蠢的问题,但我正在努力解决从Mysql到Mysqli的变化以及准备好的陈述。

所以在mysql中,我会这样做:

$q=('SELECT * FROM table WHERE field="'.$variable.'"');
$result = mysql_query($q);

我现在知道这不好。所以我现在有以下内容:

$stmt = $mysqli->prepare('SELECT * FROM table WHERE field=? LIMIT 1');
$stmt->bind_param('s', $variable);
$stmt->execute();

问题是查询不起作用。说的?实际上是“树”。所以查询变为:

'SELECT * FROM table WHERE field=tree LIMIT 1'

如果我试着在phpmyadmin中运行该查询,我会在where子句中获得“未知列树”。显然,如果我在它周围加上引号,那么它可以工作,因此是原始查询。那么如果我不能使用引号,怎么才能让它工作呢?从那以后你在寻找文字问号?

作为参考,我正在使用此代码:

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

因为我不能使用非常烦人的get_result()。我有PHP版本5.4,甚至mysqlnd驱动程序,但无法启用它,因为我在VPS上,我的主机说它可能会影响该服务器上的其他站点。因此,实际上MySql中只有两行实际上就是“改进的”mysqli中的15行。大。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

此:

$stmt = $mysqli->prepare('SELECT * FROM table WHERE field=? LIMIT 1');
$stmt->bind_param('s', $variable);

等同于此:

SELECT * FROM table WHERE field=tree LIMIT 1

预准备语句占位符与复制和粘贴值不同。您在此处将值"tree"绑定为字符串,数据库实际上将理解这一点。 ?不仅仅被绑定值替换,数据库理解查询结构与其占位符之间的差异以及您绑定到的他们。以这种方式绑定参数等同于运行:

SELECT * FROM table WHERE field='tree' LIMIT 1

答案 1 :(得分:0)

  

因此,在MySql中实际上只有两行实际上现在就像'改进'的mysqli中的15行一样。大。

Mysqli不打算按原样使用。它只是高级图书馆的建筑材料。明智地使用 时,它可以在一个行中为您提供数据:

$data = $db->getAll('SELECT * FROM table WHERE field=?s', $variable);

(顺便说一下,旧的mysql ext也一样)