如何在 PHP 中使用带有 PDO 的 MySQL 用户函数?

Posted

技术标签:

【中文标题】如何在 PHP 中使用带有 PDO 的 MySQL 用户函数?【英文标题】:How to use a MySQL user function with PDO in PHP? 【发布时间】:2014-05-26 13:57:44 【问题描述】:

这是我创造的,代码不起作用,我不知道我做错了什么。

例如,我不知道我应该如何注册我的函数 - 如何将其注入到查询等方面。有人可以告诉我如何正确编写这段代码吗?

错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an
 error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near 'DELI
MITER $$
CREATE FUNCTION my_sum(int1 INT, int2 INT)
  RETURNS INT
  LANG' at line 1' in mysql_test.php:18
Stack trace:
#0 mysql_test.php(18): PDO->exec('DELIMITER $$\r\nC...')
#1 main
  thrown in mysql_test.php on line 18

代码:

$db = new PDO("mysql:host=localhost;dbname=test_db;charset=utf8", 'root');
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$db->exec("CREATE TABLE IF NOT EXISTS test_table (col1 INT, col2 INT);");
for ($i = 0; $i<10; $i++) 
  $db->exec("INSERT INTO test_table VALUES(".rand().",".rand().");");

$mysql_function = <<<'NOW'
DELIMITER $$
CREATE FUNCTION my_sum(int1 INT, int2 INT)
  RETURNS INT
  LANGUAGE SQL
BEGIN
  RETURN int1+int2;
END;
$$
DELIMITER ;
NOW;
$db->exec($mysql_function);
$db->query("SELECT my_sum(col1, col2) FROM test_table")->fetchAll();

【问题讨论】:

提示:您不需要在 PHP 的 rand() 输出中连接。您可以在 MySQL 中本地调用 RAND(),并且不需要循环:INSERT INTO test_table VALUES (RAND(),RAND()),(RAND(),RAND()),(RAND(),RAND()),(RAND(),RAND());VALUES 中通过 (),(),() 分隔多个插入。 @Fred-ii- &lt;&lt;&lt;'NOW' 是 nowdoc 语法,如果您阅读了您友好链接到的页面,您会看到。 @lonesomeday 编辑:对不起,我以为是heredoc。 无论如何,您都不应该将这种查询作为正常代码的一部分运行......这样的事情应该直接在命令行中的mysql 中完成,或者通过 PHPMyAdmin 或类似的图形用户界面。 DELIMITER 是 MySQL 命令行客户端的一个客户端特性,它不是一个普通的 MySQL 语法特性,如果你尝试使用它会产生一个语法错误在 PDO 查询中。 【参考方案1】:

mysql 驱动程序不支持多语句查询。因此,DELIMITER 在查询中没有任何意义,结果是尝试使用它是语法错误。

你应该能够拥有:

$mysql_function = <<<'NOW'
CREATE FUNCTION my_sum(int1 INT, int2 INT)
  RETURNS INT
  LANGUAGE SQL
BEGIN
  RETURN int1+int2;
END;
NOW;

但是,CREATE FUNCTION 是 Data Definition Statement,您可能永远不应该在 PHP 运行的查询中使用此类语句。应该在设置服务器时定义表结构和函数,使用一次性查询,例如来自 .sql 文件、通过 mysql 命令行或像 phpMyAdmin 这样的管理 GUI。

【讨论】:

小问题:mysqli 确实支持multiple statements。 @JaredFarrish 确实如此,但是这种特殊情况使用 PDO 和 mysql 驱动程序。 new PDO(" mysql :host=localhost...【参考方案2】:

分步执行函数创建:

$db->exec('DELIMITER $$');
$db->exec('CREATE FUNCTION my_sum(int1 INT, int2 INT)
  RETURNS INT
  LANGUAGE SQL
BEGIN
  RETURN int1+int2;
END $$');
$db->exec('DELIMITER ;');

【讨论】:

以上是关于如何在 PHP 中使用带有 PDO 的 MySQL 用户函数?的主要内容,如果未能解决你的问题,请参考以下文章

在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]

带有 PDO::MYSQL_ATTR_MAX_BUFFER_SIZE 的 PHP 中的致命错误

如何使用 PHP 和 PDO 计算 MySQL 表中行子集的大小(以字节为单位)?

使用带有 --ssl 的 PHP PDO 连接到 MySQL/MariaDB,无需证书

带有条件检查的 PHP MySQL PDO TextArea Where 子句

带有 PHP PDO 的只读副本上的 MySQL 存储过程