MySQLi中的SELECT*FROM

joh*_*ack 23 php mysqli

我的网站相当广泛,我最近刚切换到PHP5(称我为大器晚成).

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

"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";
Run Code Online (Sandbox Code Playgroud)

这使它非常简单,友好.

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

这句话是否已成为过去?

如果是,如何处理涉及大量列的查询?我真的需要每次都输入它们吗?

Ale*_*lec 51

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

我可能是错的,但对于你的问题,我感觉这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();
Run Code Online (Sandbox Code Playgroud)

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

$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;
}
Run Code Online (Sandbox Code Playgroud)

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


tpd*_*pdi 32

"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";
Run Code Online (Sandbox Code Playgroud)

"SELECT * FROM tablename WHERE field1 = ? && field2 = ?";
Run Code Online (Sandbox Code Playgroud)

传递给$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
Run Code Online (Sandbox Code Playgroud)

OP评论:

所以,如果我有5个参数,我可能有"sssis"或其他东西(取决于输入的类型?)

是的,?在准备好的语句中每个参数有一个类型说明符,所有这些都是位置的(第一个说明符适用于第一个?,它被第一个实际参数(它是第二个参数bind_param)替换).

mysqli将负责逃避和引用(我认为).

  • 所以,如果我有5个参数,我可能有"sssis"或其他东西(取决于输入的类型?) (2认同)

oll*_*lle 6

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

http://www.php.net/pdo

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

$sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = :value1 && field2 = :value2");
$sth->bindParam(':value1', 'foo');
$sth->bindParam(':value2', 'bar');
$sth->execute();
Run Code Online (Sandbox Code Playgroud)

要么:

$sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = ? && field2 = ?");
$sth->bindParam(1, 'foo');
$sth->bindParam(2, 'bar');
$sth->execute();
Run Code Online (Sandbox Code Playgroud)

或者将参数作为数组执行:

$sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = :value1 && field2 = :value2");
$sth->execute(array(':value1' => 'foo' , ':value2' => 'bar'));
Run Code Online (Sandbox Code Playgroud)

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

我还认为你应该花一些时间使用Zend Framwework的一些课程,同时使用PDO.查看他们的Zend_Db,更具体地说是[Zend_Db_Factory] ​​[2].您不必使用所有框架或将应用程序转换为MVC模式,但使用框架并阅读它是花费时间的.