php – mysqli_prepare vs PDO
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – mysqli_prepare vs PDO,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2864字,纯文字阅读大概需要5分钟。
内容图文
![php – mysqli_prepare vs PDO](/upload/InfoBanner/zyjiaocheng/890/0c6c9b1563e0460db4afb2f6e77c4d6e.jpg)
背景
我正在尝试编写一个函数查询
query('type', 'parameters', 'bind_types')
我可以打电话来进行简单的查询.所有mySQL查询都在函数中
grab_sql()
所有绑定都发生在函数bind()中
call_user_func_array需要正确的函数引用所以我写了ref_arr来容纳.
问题是我没有得到我需要的结果 – 它们在结果下面发布.我认为问题在于重新绑定,正如我在那部分猜测的那样.
研究
>有关准备好的声明的信息here
>关于call_user_func_array here的信息
>有关call_user_func_array here的引用必要性的信息
问题:如何修改此代码以正确获得正确的结果?
码
function ref_arr(&$arr)
{
$refs = array();
foreach($arr as $key => $value)
{
$refs[$key] = &$arr[$key];
}
return $refs;}
public function bind($query, $input_param, $btypes)
{
$a="test_var1";$b="test_var2";
$output_arr=array($a,$b);
$input_ref = $this->ref_arr($input_param);
$output_ref = $this->ref_arr($output_arr);
if($statement=mysqli_prepare(one::$db, $query))
{
array_unshift($input_ref, $statement, $btypes);
call_user_func_array("mysqli_stmt_bind_param", $input_ref);
mysqli_stmt_execute($statement);
array_unshift($output_ref, $statement);
call_user_func_array("mysqli_stmt_bind_result", $output_ref);
mysqli_stmt_fetch($statement);
var_dump($output_ref);
mysqli_stmt_close($statement);
}
}
public function grab($type)
{
switch($type)
{
case "validate_user":
$query="SELECT email,pass FROM cr WHERE email=? AND pass=?";
break;
case "another_query_type":
break;
}
return $query;
}
public function query($qtype, $arg_arr, $btypes)
{
return self::bind(self::grab_sql($qtype), $arg_arr, $btypes);
}
}
测试用例
<?php
require_once 'p0.php';
$db_ = new database();
$db_->query('validate_user',array('joe@gmail.com','Password'), 'ss');
?>
结果
值结果似乎是(最后两个值)& NULL和& NULL.
array(3) { [0]=> object(mysqli_stmt)#2 (9) {
["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(2) ["field_count"]=> int(2) ["errno"]=> int(0) ["error"]=> string(0) "" ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) } [1]=> &NULL [2]=> &NULL
}
解决方法:
是的,在Mysqli中编写一个通用绑定 – 这个数组到查询是一个皇家PITA.当我编写Zend Framework的mysqli适配器时,我最终得到了它,但它需要做很多工作.欢迎您查看代码.我看到一个主要区别,这是我如何做参考:
$stmtParams = array();
foreach ($params as $k => &$value) {
$stmtParams[$k] = &$value;
}
call_user_func_array(
array($this->_stmt, 'bind_param'), // mysqli OO callback
$stmtParams
);
这与你的略有不同.我想知道你的代码中是否包含ref运算符&绑定比数组index []运算符更紧密.
注意我还必须在foreach和赋值中使用ref运算符.我从来没有完全理解为什么,但这是唯一可行的方法. PHP refs非常神秘且难以理解.
如果您遇到启用了Mysqli而不是PDO的环境,这可能不是一个可行的建议,但您应该考虑使用PDO. PDO会为您处理大量工作;您可以简单地将一个值数组传递给PDOStatement::execute(),以获得带参数的预准备查询.对我来说,使用PDO比使用mysqli要容易得多.
$pdoStmt->execute( array('joe@gmail.com','Password') ); // it's that easy
P.S.:我希望你是not storing passwords in plaintext.
内容总结
以上是互联网集市为您收集整理的php – mysqli_prepare vs PDO全部内容,希望文章能够帮你解决php – mysqli_prepare vs PDO所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。