【问题标题】:How to use a MySQL user function with PDO in PHP?如何在 PHP 中使用带有 PDO 的 MySQL 用户函数?
【发布时间】: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 查询中。

标签: php mysql pdo user-defined-functions


【解决方案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 FUNCTIONData 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 ;');

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2019-12-24
    • 2011-06-08
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多