为了账号安全,请及时绑定邮箱和手机立即绑定

在MySQLi中选择* FROM

/ 猿问

在MySQLi中选择* FROM

一只甜甜圈 2019-12-27 09:15:37

我的网站范围相当广泛,最近我刚切换到PHP5(称我为后期开发者)。


我之前所有的MySQL查询都是这样构建的:


"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";

这使得它非常容易,简单和友好。


由于明显的安全性原因,我现在正尝试切换到mysqli,并且SELECT * FROM在bind_param需要特定参数时很难弄清楚如何实现相同的查询。


这句话已成为过去吗?


如果是的话,如何处理涉及大量列的查询?我真的需要每次都把它们全部打出来吗?


查看完整描述

3 回答

?
凤凰求蛊

"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";

变成


"SELECT * FROM tablename WHERE field1 = ? && field2 = ?";

传递给$mysqli::prepare:


$stmt = $mysqli->prepare(

  "SELECT * FROM tablename WHERE field1 = ? && field2 = ?");

$stmt->bind_param( "ss", $value, $value2); 

// "ss' is a format string, each "s" means string

$stmt->execute();


$stmt->bind_result($col1, $col2);

// then fetch and close the statement

OP评论:


因此,如果我有5个参数,则可能会有“ sssis”之类的东西(取决于输入的类型?)


正确,?在准备好的语句中,每个参数都有一个类型说明符,它们都在位置上(第一个说明符适用于第一个?,由第一个实际参数替换(这是的第二个参数bind_param))。


mysqli将负责转义和引用(我认为)。


查看完整回答
反对 2019-12-27
?
繁花不似锦

这已经是一个月前了,但是哦。


我可能是错的,但是对于您的问题,我感觉bind_param并不是这里真正的问题。您始终需要定义一些条件,可以直接在查询字符串本身中bind_param用于设置?占位符。那不是真正的问题。


我使用MySQLi SELECT *查询的问题是其中的bind_result一部分。那就是它变得有趣的地方。我从Jeffrey Way那里看到了这篇文章:http://jeff-way.com/2009/05/27/tricky-prepared-statements/(此链接不再有效)。该脚本基本上遍历结果并将其作为数组返回-无需知道有多少列,您仍然可以使用准备好的语句。


在这种情况下,它将看起来像这样:


$stmt = $mysqli->prepare(

  'SELECT * FROM tablename WHERE field1 = ? AND field2 = ?');

$stmt->bind_param('ss', $value, $value2);

$stmt->execute();

然后使用网站中的代码段:


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

}

而$results现在包含了所有来自信息SELECT *。到目前为止,我发现这是一个理想的解决方案。


查看完整回答
反对 2019-12-27
?
慕田峪9158850

切换时,切换到PDO而不是mysqli,它可以帮助您编写数据库不可知代码,并为准备好的语句提供更好的功能。


http://www.php.net/pdo


PDO的Bindparam:http ://se.php.net/manual/zh/pdostatement.bindparam.php


$sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = :value1 && field2 = :value2");

$sth->bindParam(':value1', 'foo');

$sth->bindParam(':value2', 'bar');

$sth->execute();

要么:


$sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = ? && field2 = ?");

$sth->bindParam(1, 'foo');

$sth->bindParam(2, 'bar');

$sth->execute();

或使用参数作为数组执行:


$sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = :value1 && field2 = :value2");

$sth->execute(array(':value1' => 'foo' , ':value2' => 'bar'));

如果您希望将来您的应用程序能够在不同的数据库上运行,则对您来说将更加容易。


我还认为,在与PDO一起工作时,您应该花一些时间使用Zend Framwework的某些类。查看他们的Zend_Db,更具体地说是[Zend_Db_Factory] [2]。您不必使用所有框架,也不必将应用程序转换为MVC模式,但是使用框架并仔细阅读它会花费很多时间。


查看完整回答
反对 2019-12-27

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信