【问题标题】:mysql stored function does not work with prepared statements (php)mysql存储函数不适用于准备好的语句(php)
【发布时间】:2025-12-16 15:05:02
【问题描述】:

我正在尝试在 innoDB 中创建序列替换(因为 auto_increment 的行为与 myisam 中的不同)。所以我创建了一个名为 seq 的存储函数。我可以按如下方式使用它:

INSERT INTO a_table(id) VALUES(seq('seq_a_table'));

我的基于 mysqli 的数据库库自动使用准备好的语句,所以我得到这个错误:

This command is not supported in the prepared statement protocol yet 

MySQL 版本:5.1.48(OSX 雪豹)。

更新

哇,我觉得自己很愚蠢……我被这个错误弄糊涂了,以至于我错过了一个简单的事实,即它不是由相关语句抛出的。我正在使用事务并忘记了我的查询功能会自动将所有内容编译为语句,包括“START TRANSACTION”。 所以对于未来的深夜编码员 - 不要试图在语句中开始交易:)

【问题讨论】:

  • 拥有它们到底有什么意义?它们在最常见的情况下工作,这不是一件好事吗?
  • 您能否展示一下您是如何尝试使用准备好的语句的?
  • @Barmar 说得像个真正的乐观主义者 :) 我只是厌倦了试图克服一个问题,却又用这个愚蠢的数据库引擎面对另一个问题。我已经更新了我的答案,以向您展示我的库是如何工作的,但您可能不会在那里找到任何令人兴奋的东西。
  • $q 的值是多少?我想看看您是如何尝试使用参数化查询调用存储过程的。
  • 这不是乐观,只是事实的陈述:大多数 SQL 应用程序都可以利用准备好的语句。无法使用的情况有很多,这就是其中之一。

标签: php mysql stored-procedures innodb


【解决方案1】:

在这种情况下,为什么不直接使用旧的 mysql。类似:

$con = mysql_connect("192.168.x.x","host","pass");
if (!$con) die('Could not connect: ' . mysql_error());
mysql_select_db("yourdb", $con) or die("cannot select DB");

mysql_query( "INSERT INTO a_table(id) VALUES(seq('seq_a_table'))" );

【讨论】:

  • 因为它已被弃用
  • “为什么不直接使用旧的 mysql。” - 嗯...不。不推荐使用MySQL_。因此,至少使用MySQLi_ 是可行的方法。
  • @user4035 领先我 4 秒 ;-)
  • @AwokeKnowing - 如果您被否决,请不要感到惊讶。不会是我,但不要感到惊讶。
  • 为什么不呢?为什么我们不首先使用它?因为我的查询只是一个示例,在现实生活中,您希望尽可能避免被注射。并且使用您的建议需要转义字符串,这就是我首先转向准备好的语句的原因。