У меня есть проблема, используя следующие функции PHP:Multiple PHP MySQLi подготовленных операторов (INSERT UPDATE SELECT) странное поведение
function saveCommentOnDB($arg_textComment, $arg_score, $arg_userEmail)
{
$result_tmp = null;
$this->conn->autocommit(false);
echo "saving\n";
echo "text comment: \n";
var_dump($arg_textComment); // OKAY
echo "comment score: \n";
var_dump($arg_score); // OKAY
echo "user mail: \n";
var_dump($arg_userEmail); // OKAY
try {
//[tag1] $query_1 = "INSERT INTO commenti (userFirstname, userEmail, textComment, score, feedback) VALUES ((SELECT firstname FROM utente u WHERE u.userEmail = '[email protected]') ,'[email protected]', 'This is an example comment.', 5, 0);";
$query_1 = "INSERT INTO commenti (userFirstname, userEmail, textComment, score, feedback) VALUES ((SELECT firstname FROM utente u WHERE u.userEmail = ?) ,?,?, ?, 0);";
$query_2 = "UPDATE utente SET commentID=(SELECT c.commentID FROM commenti c WHERE c.userEmail = ?) WHERE userEmail = ?;";
$query_3 = "SELECT commentID, textComment FROM commenti WHERE userEmail = ?;";
$stmt1 = $this->conn->prepare($query_1);
$stmt2 = $this->conn->prepare($query_2);
$stmt3 = $this->conn->prepare($query_3);
$stmt1->bind_param("sssd", $arg_userEmail, $arg_userEmail, $arg_textComment, $arg_score);
$stmt2->bind_param("ss", $arg_userEmail, $arg_userEmail);
$stmt3->bind_param("s", $arg_userEmail);
$stmt1->execute();
$stmt2->execute();
$stmt3->execute();
$stmt3->bind_result($col1, $col2);
$stmt3->fetch();
echo "result:\n";
var_dump($col1); // OKAY
var_dump($col2); // OKAY
$result_tmp = array(
'commentID' => $col1,
'textComment' => $col2
);
$this->conn->commit();
} catch (Exception $e) {
$this->conn->rollback();
}
return $result_tmp;
}
Пожалуйста, игнорировать echo
и var_dump
, я их только для отладки.
Проблема в том, что в этой функции эти три подготовленные операторы работают неправильно. В частности, заявление $stmt1
: результат $stmt3
верен (как если бы $stmt1
и $stmt2
выполнены правильно), но я ничего не вижу в своей базе данных. Другими словами: операторы корректно работают «временно» во время выполнения, но в MyPHP Admin ничего нет в таблице commenti
.
Например, мы предполагаем, имея это в БД:
Теперь я запускаю функцию со следующими параметрами:
$arg_textComment = 'This is an example comment'
$arg_score = '5'
и мы имеем в моем браузере консоли:
то есть: CommentID (28) правильно и текст комментария (commentcomment) был "спасен", то я перепроверить БД, но у меня до сих пор это:
и var_dump($stmt1)
после выполнения является:
stmt1:
object(mysqli_stmt)#4 (10) {
["affected_rows"]=>
int(1)
["insert_id"]=>
int(41)
["num_rows"]=>
int(0)
["param_count"]=>
int(4)
["field_count"]=>
int(0)
["errno"]=>
int(0)
["error"]=>
string(0) ""
["error_list"]=>
array(0) {
}
["sqlstate"]=>
string(5) "00000"
["id"]=>
int(4)
}
var_dump
Кажется, все в порядке, но DB nope.
Так что я пытаюсь выполнить запрос «вручную» с помощью этого (он будет выполнен только код в зеленый облицованный ящик):
и у меня есть то, что я ожидал:
sql> INSERT INTO commenti (userFirstname, userEmail, textComment, score, feedback) VALUES ((SELECT firstname FROM utente u WHERE u.userEmail = '[email protected]') ,'[email protected]', 'commentcomment', '5', 0) [2017-01-21 17:38:28] 1 row affected in 11ms
Имейте в виду score
значение магазина на БД, как float
,
SQL-запрос $stmt1
тот же, который я вставил вручную (через PHPStorm).
Почему первое не работает, а второе - да?
Надеется, что это скринкасто может помочь:
Если ваш первый запрос не работает, тогда во время его выполнения была ошибка –
Я попытался прокомментировать '$ stmt2' и' $ stmt3', '$ stmt1' отлично работает, и я вижу новую строку на DB. Я также попытался объединить три заявления в одном, но это не помогло. Не имеют ни малейшего представления о. – kitsune
Тем не менее, ответ всегда один и тот же: если некоторые данные не находятся в БД, то некорректный запрос. Если какой-то запрос не удался, произошла ошибка. Если возникла ошибка, вы должны ее прочитать и исправить проблему. Так просто, как –