如何在 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- <<<'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,无需证书