2017-01-21 3 views
0

У меня есть проблема, используя следующие функции 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.

Например, мы предполагаем, имея это в БД:

enter image description here

Теперь я запускаю функцию со следующими параметрами:

  • $arg_textComment = 'This is an example comment'
  • $arg_score = '5'

и мы имеем в моем браузере консоли:

enter image description here

то есть: CommentID (28) правильно и текст комментария (commentcomment) был "спасен", то я перепроверить БД, но у меня до сих пор это:

enter image description here

и 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.

Так что я пытаюсь выполнить запрос «вручную» с помощью этого (он будет выполнен только код в зеленый облицованный ящик):

enter image description here

и у меня есть то, что я ожидал:

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 

enter image description here

Имейте в виду score значение магазина на БД, как float ,

SQL-запрос $stmt1 тот же, который я вставил вручную (через PHPStorm).

Почему первое не работает, а второе - да?

Надеется, что это скринкасто может помочь:

https://youtu.be/UsYK93jYVqA

+0

Если ваш первый запрос не работает, тогда во время его выполнения была ошибка –

+0

Я попытался прокомментировать '$ stmt2' и' $ stmt3', '$ stmt1' отлично работает, и я вижу новую строку на DB. Я также попытался объединить три заявления в одном, но это не помогло. Не имеют ни малейшего представления о. – kitsune

+0

Тем не менее, ответ всегда один и тот же: если некоторые данные не находятся в БД, то некорректный запрос. Если какой-то запрос не удался, произошла ошибка. Если возникла ошибка, вы должны ее прочитать и исправить проблему. Так просто, как –

ответ

0

Проблема решена, изменение от этого:

 $stmt1->execute(); 
     $stmt2->execute(); 
     $stmt3->execute(); 

к этому:

 $stmt1->execute(); 
     $this->conn->commit(); 
     $stmt2->execute(); 
     $this->conn->commit(); 
     $stmt3->execute(); 
     $this->conn->commit(); 

Понятия не имеет, почему .. но он работает после многих тестов.

+0

ваше «решение» делает абсолютно не имеет смысла –

Смежные вопросы