PHP:带有“select *”的Mysqli准备语句
Posted
技术标签:
【中文标题】PHP:带有“select *”的Mysqli准备语句【英文标题】:PHP: Mysqli prepared statement with "select *" 【发布时间】:2015-06-01 07:10:18 【问题描述】:这就是我目前从数据库中获取的方式:
if ($stmt = $mysqli->prepare ( "SELECT fname,lname from $table_name
where cno >=? LIMIT 50" ))
$stmt->bind_param ( "i", $cno);
$stmt->execute ();
$stmt->bind_result ($fname,$lname);
$arrayUsers = array();
while ($stmt->fetch())
if (isset ($fname))
$arrayUsers[] = array(
"fname" => $fname,
"lname" => $lname);
$stmt->close ();
$mysqli->close ();
而且效果很好。
但是,如果我将选择更改为 SELECT * from
... 我的绑定将失败。
这是否意味着如果我有大量字段,我仍然必须指定每个字段,还是有办法使用select *
?
----更新---
if (empty($arrayUsers))
return 0;
else
return $array;
【问题讨论】:
您也应该将$table_name
作为参数传递
我写的,在函数参数里,我没有写在这里,因为它只是不必要地占用空间
当您说绑定时,您指的是 bind_param 还是 bind_result? bind_result 需要为返回的每一列提供一个变量。确保它与列数匹配
我的意思是如何使用select *
而不是select field1,field2
等
@JohnConde - 他不应该。 SELECT * FROM 'foo'
与 SELECT * FROM foo
不同。
【参考方案1】:
如果您需要选择所有列:
SELECT * FROM `table`
您将使用 php 的 get_result()
而不是 bind_result()
。
bind_result()
在您指定要检索的每一列时会更好,get_result()
将允许您从表中处理更通用的数据返回。
【讨论】:
谢谢,杰!正是我想要的:)【参考方案2】:SELECT *
绝不是一个好主意。
最好是明确的。
如果您只有 2 列,它会起作用。
bind_result
就是这样工作的,数字变量需要匹配列。
除此之外,它需要在相同的顺序
编辑: pdo 中的示例:
if ($stmt = $pdo->prepare ("SELECT * from `$table_name` where cno >=:cno LIMIT 50" ))
$stmt->execute([':cno'=>$cno]);
$arrayUsers = $stmt->fetchAll();
$stmt->close();
$pdo->close();
【讨论】:
感谢您的回复!如果只有几列我不在乎,我有一些表超过 2 或 10,我只是好奇如何获得select *
而不是显式调用每一列。不确定它是否可能......
如果您事先知道要获取多少列并绑定所有变量,则可能。如果您添加或删除列,这很危险,您的代码会中断
投票支持您的答案。我意识到select *
的陷阱,但我只是想知道如何做到/是否可以做到,杰回答了我的问题。再次感谢:)
@Ryan 是的,这就是您实现它所需要的,如果您不介意切换好运,PDO 也可以轻松完成
谢谢!有 PDO 的示例吗?以上是关于PHP:带有“select *”的Mysqli准备语句的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mysqli 中为带有 IN 的 SELECT 提供参数