PHP MYSQL выполняет запрос дважды - PullRequest
0 голосов
/ 23 ноября 2018

Когда я запускаю следующий скрипт.Строка вставляется дважды (запрос выполняется дважды).

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.Я хочу убедиться, что запрос был успешно выполнен.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Одно из полезных применений подготовленных утверждений на любом языке состоит в том, что вы можете подготовить их один раз, а затем выполнить их столько раз, сколько необходимо.

Так что в вашем случае вы 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";
}
0 голосов
/ 23 ноября 2018

Вы выполняете $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";
}
0 голосов
/ 23 ноября 2018

Это потому, что он вызывает функцию $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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...