我的目标是同时使用事务和准备好的语句,以实现数据的完整性和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)最后,为什么不做一个"加入"(或联合,如果兼容)而不是两个"选择"?
归档时间: |
|
查看次数: |
16118 次 |
最近记录: |