加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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错误消息).
见pdo.begintransaction,pdo.commit,pdo.rollback和pdo.error-handling.

例:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读