【问题标题】:Mysqli prepare giving error, even though SQL statement is valid?mysqli准备报错,即使SQL语句有效?
【发布时间】:2012-01-09 20:50:27
【问题描述】:

我在使用 PHP 和 mySQL 进行 SQL 事务时遇到了一些问题。这是我的声明:

START TRANSACTION;
INSERT INTO listings (title, price, seller, description, time, featured)
              VALUES (?, ?, ?, ?, ?, 0);
SELECT @listingid:=LAST_INSERT_ID();
INSERT INTO pictures (listid, primarypic)
                VALUES (@listingid, 1);
COMMIT;

虽然当我直接使用 phpMyAdmin(替换 ? 标记)将其放入时,此语句工作正常,但当我调用时它似乎失败

$stmt = $mysqli->prepare("statement");

将“声明”替换为上述声明。在到达 $stmt 的 bind_param 之前它失败的事实让我相信这不是参数的问题,而是查询的问题。

这是确切的错误,如果有帮助的话:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“插入到列表(标题、价格、卖家、描述、时间、特色)”附近使用正确的语法

提前感谢您的帮助!

【问题讨论】:

    标签: php mysql mysqli prepared-statement


    【解决方案1】:

    我不认为mysqli 可以处理这样的复合语句(特别是因为有一个单独的commit() 函数)。代替开头的START TRANSACTION; 和结尾的COMMIT;,您应该在查询之前执行$mysqli->autocommit(false);,完成后执行$mysqli->commit();

    【讨论】:

    • +1 另外,来自mysqli_prepare docs"查询必须由单个 SQL 语句组成。""注意:您不应添加终止符分号或 \g 到语句中。”
    • 所以我应该把 $mysqli->commit();在 $stmt->execute() 之后; ?
    • @Wiseguy 不错。不知道我是怎么错过的。猜猜我得做一个存储过程。
    【解决方案2】:

    问题是你只能“准备”一个 SQL 语句——你在这里尝试准备五个 SQL 语句。

    做你想做的事情的一种方法是创建一个存储过程。

    来自mysqli_prepare() documentation

    准备 SQL 查询,并返回一个语句句柄以用于对该语句的进一步操作。查询必须由单个 SQL 语句组成。

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 2014-06-11
      • 1970-01-01
      • 2012-12-01
      • 2013-10-22
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多