我的网站相当广泛,我最近刚切换到PHP5(称我为大器晚成).
我之前的所有MySQL查询都是这样构建的:
"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";
Run Code Online (Sandbox Code Playgroud)
这使它非常简单,友好.
我出于明显的安全原因,现在正试图切换到mysqli,并且SELECT * FROM
在bind_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将负责逃避和引用(我认为).
在切换时,切换到PDO而不是mysqli,它可以帮助您编写数据库agnositc代码,并为准备好的语句提供更好的功能.
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模式,但使用框架并阅读它是花费时间的.
归档时间: |
|
查看次数: |
102623 次 |
最近记录: |