很抱歉,如果这似乎是一个非常愚蠢的问题,但我正在努力解决从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行。大。
任何帮助将不胜感激!
答案 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也一样)