我在使用以下 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;
}
请忽略echo
和var_dump
,我放置它们只是为了调试。
问题是,在这个函数中,这三个准备好的语句似乎工作不正确。特别是声明$stmt1
: $stmt3
的结果是正确的(就像 $stmt1
和 $stmt2
正确执行一样),但我在数据库上看不到任何内容。换句话说:语句在执行期间“暂时”正确工作,但在 MyPHP Admin 中表上没有任何内容 commenti
.
例如,我们假设数据库上有这个:
现在我使用以下参数启动该函数:
-
$arg_textComment = 'This is an example comment'
-
$arg_score = '5'
-
$arg_userEmail = 'asd@asd.asd'
我们在我的浏览器控制台上有:
即: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 不行。
因此,我尝试通过此“手动”执行查询(它将仅执行绿线框中的代码):
我得到了我所期望的:
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
记住score
值在数据库中存储为 float
.
$stmt1
的SQL查询与我手动插入的相同(INSERT INTO...
通过 PHPStorm)。
为什么第一个不起作用而第二个却起作用?
希望此截屏视频可以有所帮助:
最佳答案
问题已解决,从此更改:
$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/