我正在尝试使用PHP中的PDO更新MySql数据库。 我需要启动4行SQL代码。最后一个是SELECT语句,它应该只返回一个整数值。
抛出的错误是:
<div class="g-signin2" data-onsuccess="onSignIn"></div>
以下是代码:
exception 'PDOException' with message 'SQLSTATE[HY000]: General error' in C:\xampp\htdocs\php\set-lesson-finished.php:22
Stack trace:
#0 C:\xampp\htdocs\php\set-lesson-finished.php(22): PDOStatement->fetchColumn()
#1 {main}
答案 0 :(得分:6)
这不是单个查询,而是四个查询。您将获得四个不同的结果集,需要单独检索。
您发现的错误正在发生,因为您无法在fetchColumn()
查询上调用DELETE
(它不会返回结果集)。同样适用于INSERT
和UPDATE
。
您可以试用PDOStatement::nextRowSet(),但分别运行这四个查询可能更容易。如果您担心全部或全无更新,则应使用PDO::beginTransaction()
和PDO::commit()
答案 1 :(得分:3)
当查询变得复杂时,您需要使用存储过程:
DELIMITER //
CREATE PROCEDURE your_sp(IN `p_bought_id`, IN `p_time_invested`, IN `p_points_earned`, IN `p_user_id`)
BEGIN
DELETE FROM unfinished_lessons WHERE bought_id = p_bought_id;
INSERT INTO finished_lessons VALUES (p_bought_id, p_time_invested, NOW());
UPDATE users SET points = points + p_points_earned WHERE id = p_user_id;
SELECT points FROM users WHERE id = p_user_id;
END //
DELIMITER ;
您可以在一个查询中调用它:
$query_save = $db_connection->prepare('
call your_sp(:bought_id, :time_invested,:points_earned, :user_id)
');
答案 2 :(得分:0)
如果绝对希望同时运行多个语句,则应使用 mysqli 扩展名(不是PDO )。
正如您在Feature comparison中看到的那样(参见比较表),只有 ext / mysqli 完全支持多个MySQL查询(并且还支持所有MySQL 5.1+功能)。
而且,正如Drupal的dawehner所说,MySQL PDO no longer allows multiple database queries to be executed at the same time。
答案 3 :(得分:0)
我将查询拆分为四个,一切都按预期工作:
$db_connection = new PDO('mysql:host='. DB_HOST .';dbname='. DB_NAME . ';charset=utf8', DB_USER, DB_PASS, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$db_connection->beginTransaction();
$query = $db_connection->prepare('DELETE FROM planz_unfinished_lessons WHERE bought_id = :bought_id;');
$query->bindValue(':bought_id', (int)$_POST['bought_id'], PDO::PARAM_INT);
$query->execute();
$query = $db_connection->prepare('INSERT INTO planz_finished_lessons VALUES (:bought_id, :time_invested, NOW())');
$query->bindValue(':bought_id', (int)$_POST['bought_id'], PDO::PARAM_INT);
$query->bindValue(':time_invested', (int)$_POST['time_invested'], PDO::PARAM_INT);
$query->execute();
$query = $db_connection->prepare('UPDATE planz_users SET points = points + :points_earned WHERE id = :user_id');
$query->bindValue(':points_earned', (int)$_POST['points_earned'], PDO::PARAM_INT);
$query->bindValue(':user_id', (int)$_SESSION['user_id'], PDO::PARAM_INT);
$query->execute();
$query_check = $db_connection->prepare('SELECT points FROM planz_users WHERE id = :user_id');
$query_check->bindValue(':user_id', (int)$_SESSION['user_id'], PDO::PARAM_INT);
$query_check->execute();
$db_connection->commit();
$_SESSION['points'] = $query_check->fetchColumn();
echo $_SESSION['points'];
请注意使用beginTransaction
和commit
,因为它们可以加快查询速度。