如何使用与PHP交易相结合的预准备语句?

ale*_*186 7 php mysql pdo

我的目标是同时使用事务和准备好的语句,以实现数据的完整性和SQL注入的预防.

我有这个:

   try {
        $cnx = new PDO($dsn,$dbuser,$dbpass);   
        $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $cnx->beginTransaction();
        $cnx->query("SELECT * FROM users WHERE username=$escaped_input");
        $cnx->query("SELECT * FROM othertable WHERE some_column=$escaped_input_2");

        $cnx->commit();
    }

    catch (Exception $e){
           $cxn->rollback();
           echo "an error has occured";

    }
Run Code Online (Sandbox Code Playgroud)

我希望将查询合并为一个准备好的语句:

$stmt=$cxn->prepare("SELECT * FROM users WHERE username=?");
$stmt->execute(array($user_input));

$stmt_2=$cxn->prepare("SELECT * FROM othertable WHERE some_column=?");
$stmt_2->execute(array($user_input_2));
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑

我收到此错误:

PHP Parse错误:语法错误,意外的T_CATCH

这是我更新的代码:

try 
{
    $cnx = new PDO($dsn,$dbuser,$dbpass);   
    $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $cnx->beginTransaction();
    $stmt=$cnx->prepare("SELECT * FROM users WHERE username=?");
    $stmt->execute(array($username));

    $cnx->commit();

    while ($row=$stmt->fetch(PDO::FETCH_OBJ)){
    echo $stmt->userid;

}

catch(Exception $e) { 
    if (isset($cnx)) 
        $cnx->rollback();
       echo "Error:  " . $e; 
    }
Run Code Online (Sandbox Code Playgroud)

Jer*_*oen 11

try 
{
    $cnx = new PDO ($dsn,$dbuser,$dbpass);   
    $cnx->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $cnx->beginTransaction ();

    $stmt = $cnx->prepare ("SELECT * FROM users WHERE username=?");
    $stmt->execute(array($username));

    $cnx->commit();

    while ($row = $stmt->fetch (PDO::FETCH_OBJ)){
        echo $row->userid;
    }
}

catch (Exception $e) { 
    if (isset ($cnx)) 
        $cnx->rollback ();
       echo "Error:  " . $e; 
    }
}
Run Code Online (Sandbox Code Playgroud)


pau*_*sm4 11

在调用"beginTransaction"后调用"execute".

你称之为"准备"的地方并不重要.

这是一个完整的例子:

http://php.net/manual/en/pdo.begintransaction.php

例:

 try {
    $cnx = new PDO($dsn,$dbuser,$dbpass);   
    $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $cnx->beginTransaction();

    $stmt=$cxn->prepare("SELECT * FROM users WHERE username=?");
    $stmt->execute(array($user_input));

    $stmt_2=$cxn->prepare("SELECT * FROM othertable WHERE some_column=?");
    $stmt_2->execute(array($user_input_2));

    $cnx->commit();
  }
  catch (Exception $e){
    $cxn->rollback();
    echo "an error has occurred";
  }
Run Code Online (Sandbox Code Playgroud)

PS:1)我当然假设$ user_input和$ user_input_2立即可用.您不希望您的交易挂得不必要地长;)

2)根据你上面的评论回复,我认为你可能会混淆"执行"和"开始转/提交".请看我的链接.

3)你甚至需要交易吗?你只是在做两个"选择".

4)最后,为什么不做一个"加入"(或联合,如果兼容)而不是两个"选择"?

  • 我建议加入我的回答,我认为这就是他所说的"融为一体" (2认同)