【发布时间】: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 查询中。
标签: php mysql pdo user-defined-functions