当我运行以下脚本时。该行插入两次(查询运行两次)。
require_once $_SERVER['DOCUMENT_ROOT'].'/functions/sanitize.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/main/config.php';
$response = textsanitize($_POST['r']);
$ticket = idssanitize($_POST['t']);
$stmt = $condb->prepare("INSERT INTO ticket_reponses (ticket_id,user_id,time,response) VALUES (:ticket_id,:user_id,:time,:response)");
$stmt->execute(
array(
"ticket_id" => $ticket,
"user_id" => $_SESSION['user_id'],
"time" => time(),
"response" => $response
)
);
if($stmt->execute()){
echo "SUCCESS";
}
当我删除if($stmt->execute()){echo "SUCCESSS";}
时。它以正确的方式运行。该行插入一次。
为什么if($stmt->execute())
再次执行查询?我认为if($stmt->execute())
仅返回TRUE || FALSE
。我想确保查询已成功执行。
答案 0 :(得分:1)
这是因为它两次调用$stmt->execute()
函数。一次在if语句之前,一次作为if语句中的条件。
因此,您需要删除它的一个实例。
我认为您需要检查该语句是否已正确执行(因此为if)。因此,代码可以像...
require_once $_SERVER['DOCUMENT_ROOT'].'/functions/sanitize.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/main/config.php';
$response = textsanitize($_POST['r']);
$ticket = idssanitize($_POST['t']);
$stmt = $condb->prepare("INSERT INTO ticket_reponses (ticket_id,user_id,time,response) VALUES (:ticket_id,:user_id,:time,:response)");
$values = array(
"ticket_id" => $ticket,
"user_id" => $_SESSION['user_id'],
"time" => time(),
"response" => $response
);
if($stmt->execute($values)){
echo "SUCCESS";
}
答案 1 :(得分:1)
任何语言中的预处理语句的一个很好的用途是,您可以准备一次,然后根据需要执行多次。
因此,在您的情况下,您两次execute()
语句,但是有可能您可以在循环中插入具有相同准备语句的一堆数据。每次调用execute()
时,您都可以传递一组新值来运行准备好的语句。在您的情况下,它是INSERT,因此运行两次。
您可能只需要...
$stmt = $condb->prepare("INSERT INTO ticket_reponses (ticket_id,user_id,time,response) VALUES (:ticket_id,:user_id,:time,:response)");
if($stmt->execute(array(
"ticket_id" => $ticket,
"user_id" => $_SESSION['user_id'],
"time" => time(),
"response" => $response))) {
echo "SUCCESS";
}
答案 2 :(得分:1)
您执行两次$stmt->execute()
,因此只需插入两行。这里没有火箭科学。
如果要检查查询是否成功运行,请在第一条语句本身中进行。
require_once $_SERVER['DOCUMENT_ROOT'].'/functions/sanitize.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/main/config.php';
$response = textsanitize($_POST['r']);
$ticket = idssanitize($_POST['t']);
$stmt = $condb->prepare("INSERT INTO ticket_reponses (ticket_id,user_id,time,response) VALUES (:ticket_id,:user_id,:time,:response)");
$isSuccessful = $stmt->execute(
array(
"ticket_id" => $ticket,
"user_id" => $_SESSION['user_id'],
"time" => time(),
"response" => $response
)
);
if($isSuccessful){
echo "SUCCESS";
}