【发布时间】:2018-01-30 07:43:47
【问题描述】:
我的目标是同时使用事务和准备好的语句,以实现数据的完整性和防止 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";
}
我想将查询与准备好的语句合并:
$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));
我怎样才能做到这一点?
编辑
我收到此错误:
PHP 解析错误:语法错误,意外的 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;
}
【问题讨论】:
-
你能重述这个问题吗?
-
不,因为我不知道如何处理
commit()和execute(),因为它们应该做大致相同的事情 -
不,“提交”和“执行”不要“做大致相同的事情”;)
-
我期待这个回复,我正在要求它.. :) commit 有什么作用?我认为它完全提交/执行了所有查询
-
你在最后的 WHILE 语句中缺少一个右括号