php - 多个 PHP mysqli 准备好的语句(INSERT UPDATE SELECT)奇怪的行为

标签 php mysql mysqli prepared-statement

我在使用以下 PHP 函数时遇到问题:

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 = 'asd@asd.asd') ,'asd@asd.asd', '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;
}

请忽略echovar_dump ,我放置它们只是为了调试。

问题是,在这个函数中,这三个准备好的语句似乎工作不正确。特别是声明$stmt1 : $stmt3 的结果是正确的(就像 $stmt1$stmt2 正确执行一样),但我在数据库上看不到任何内容。换句话说:语句在执行期间“暂时”正确工作,但在 MyPHP Admin 中表上没有任何内容 commenti .

例如,我们假设数据库上有这个:

enter image description here

现在我使用以下参数启动该函数:

  • $arg_textComment = 'This is an example comment'
  • $arg_score = '5'
  • $arg_userEmail = 'asd@asd.asd'

我们在我的浏览器控制台上有:

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 不行。

因此,我尝试通过此“手动”执行查询(它将仅执行绿线框中的代码):

enter image description here

我得到了我所期望的:

sql> INSERT INTO commenti (userFirstname, userEmail, textComment, score, feedback) VALUES ( (SELECT firstname FROM utente u WHERE u.userEmail = 'asd@asd.asd') ,'asd@asd.asd', 'commentcomment', '5', 0) [2017-01-21 17:38:28] 1 row affected in 11ms

enter image description here

记住score值在数据库中存储为 float .

$stmt1的SQL查询与我手动插入的相同(INSERT INTO...通过 PHPStorm)。

为什么第一个不起作用而第二个却起作用?

希望此截屏视频可以有所帮助:

https://youtu.be/UsYK93jYVqA

最佳答案

问题已解决,从此更改:

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

对此:

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

不知道为什么......😐但经过多次测试后它可以工作。

关于php - 多个 PHP mysqli 准备好的语句(INSERT UPDATE SELECT)奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41782199/

相关文章:

php - 使用 PHP 进行 MySQL 搜索

php - mysql_escape_string() 有什么作用?

mysql - 在选择查询的过程中读取 XML

php - 使用MySQL和PHP生成HTML网页时出错

php - 如何用PHP提取邮件附件?

php - 缩放数据库中的临时记录以计算总数以停止过度订阅

php - 按发生的时间对时间间隔进行分组

MySQL 查询 GROUP BY WHERE IN

php - 用php创建数据库

php - 使用 mysqli 或 PDO 时无法通过 PHP 脚本连接到 MySQL 但 mysql 可以工作