php pdo:prepare()vs transactions
发布时间:2020-12-13 22:32:45 所属栏目:PHP教程 来源:网络整理
导读:prepare()和交易是否互相排斥?我有很多查询,我构建然后执行,所以听起来像使用事务是我想要的;但我在 prepare.statment页面上读到,使用bindParam方法消除了SQL注入.有两种方法可以做到吗? 这是我现在的代码示例(可能是也可能不正确): $dbhost=FOO;$dbuser=
prepare()和交易是否互相排斥?我有很多查询,我构建然后执行,所以听起来像使用事务是我想要的;但我在
prepare.statment页面上读到,使用bindParam方法消除了SQL注入.有两种方法可以做到吗?
这是我现在的代码示例(可能是也可能不正确): $dbhost=FOO; $dbuser=FOOBAR; $dbpass=RABOOF; $options=array(STUFF); $dbh = new PDO("mysql:host=$dbhost",$dbuser,$dbpass,$options); // I know this ^ works $dbh->beginTransaction(); $record_data = $dbh->prepare("UPDATE $db.$tbl SET :column=:value WHERE `key` = :key;"); function record_data($q,$a,$k){ $record_data->bindParam(':column',$q); $record_data->bindParam(':value',$a); $record_data->bindParam(':key',$k); $record_data->execute(); } // $pairs is an array with ~50 objects/rows foreach($pairs as $pair){ list($qstn,$ans) = explode('=',$pair); switch($qstn){ case 1: if(something) record_data($qstn,$ans,$key); break; case 2: if(something) record_data($qstn,$key); break; case 3: if(something) record_data($qstn,$key); break; // more default: record_data($qstn,$key); break; } } $dbh->commit(); 当我尝试完整的代码时,我得到了没有连接,因为目标机器主动拒绝它.通常情况下,当我的连接信息错误(或帐户设置不正确/正如我所料)时,我会看到类似的消息.但我分别测试了PDO连接并且工作正常.所以我可能做错了什么. 编辑:prepare()中是否允许变量? 编辑2:我在$dbh = PDO(…)周围添加了try {},并在try结束时添加了echo“并连接”(并执行了catch位),并且它回显为“已连接”,因此它正在连接.但是在“连接”之后它会打印出该错误消息,因此在成功连接后会出现问题. 编辑3:我补充说 $dbRS = $dbh->query("SELECT * FROM `database`.`table`;"); $row = empty($dbRS) ? false : $dbRS->fetch(PDO::FETCH_ASSOC); print_r($row); 它打印了表格的第一行,所以肯定它是连接的. 解决方法
>“互相排斥吗?”:不,如你所示,是一种“函数声明”,事务就像一个(OS)进程,函数运行.
>“是否允许变量?”:我认为你必须开始检查你的PHP函数record_data($q,$k):有一个错误.尝试添加全局$record_data;在功能的开头. 一般注释:PDO的主要优点是为每个单个SQL语句捕获错误(通过PHP错误行或返回SQL错误消息). 例: $dbh->beginTransaction(); /* Do SQL */ $sth1 = $dbh->exec("CREATE TABLE xyz (..)"); $sth2 = record_data($qstn1,$ans1,$key1); $sth2 = record_data($qstn2,$ans2,$key2); /* Commit the changes */ $dbh->commit(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |