php pdo定义一个函数然后在select语句中使用它

oknwwptz  于 2023-06-28  发布在  PHP
关注(0)|答案(3)|浏览(77)

我的查询有点像这样:

CREATE FUNCTION func ... ;
SELECT * FROM  ....;

我使用的是php的PDO,它不允许在$pdo->query()中有超过1个语句,所以我决定将查询分为两个,所以我使用$pdo->exec()执行CREATE FUNCTION查询,然后在select语句上使用$pdo->query()
但是,我在执行select语句FUNCTION database.func does not exist时遇到错误。我该怎么解决这个问题?当我在phpmyadmin中将其作为单个查询运行时,它工作正常
编辑:PHP代码:

class MyClass {
function connectPDO($user,$pass,$chartset="utf8"){
    //simple function for making a new PDO object and mysql connection
    $dbname = "my_db";
    try {
        //creating new pdo
        $pdo = new PDO('mysql:host=localhost;dbname='.$dbname, $user,$pass);
        //attributes set to throw errors and exceptions which can be caught, can be changed
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        //fetch associative arrays
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
        //default chartset
        $pdo->exec('SET NAMES "'.$chartset.'"');
      } catch (PDOException $e) {
        //on some error
        $output = "Ay caramba! there's something wrong here!.<br>";
        echo $output.$e->getMessage();
        exit();
    }

    $this->db = $pdo;
}
}

$object = new MyClass();
$object->connectPDO("user","pass");
$sqlPreliminary = "
        DROP FUNCTION IF EXISTS myFunc;
        DELIMITER //

        CREATE FUNCTION myFunc (id INT)
            RETURNS DECIMAL

            BEGIN
            RETURN id + 1;
            END //
        DELIMITER ;

";

$sqlFinal = "
    SELECT id, myFunc(id) AS plusOne  FROM table;
";
$object->db->exec($sqlPreliminary);
var_dump($object->db->query($sqlFinal)->fetchAll(PDO::FETCH_ASSOC));
jxct1oxe

jxct1oxe1#

编辑:

这是一个多重陈述。第一部分是DROP FUNCTION MyFunc IF EXISTS,第二部分是CREATE FUNCTION

  • 这是我以前的答案,是正确的,但OP更改了代码:*

你没有说$object->db是什么:
调用connectPDO("user","pass");,然后使用$object->db->exec($sqlPreliminary);$object在函数体中应该是全局的。目前它不是,所以它是一个局部变量,在函数结束后丢失。其余代码中的$object有些不同。

qv7cva1a

qv7cva1a2#

我也遇到过同样的问题。当我删除“DELIMITER //”(也是// DELIMITER ;最后),它起作用了。我认为PHP PDO不再需要DELIMITER。

$sqlPreliminary = "
    DROP FUNCTION IF EXISTS myFunc;
   
    CREATE FUNCTION myFunc (id INT)
        RETURNS DECIMAL

        BEGIN
        RETURN id + 1;
        END 

";

我测试了这个并工作。

wwodge7n

wwodge7n3#

创建一个用户定义的函数使用PDO简单地通过exec工作,没有定界符是必需的。这里$db是PDO示例。

$db->exec('CREATE FUNCTION ConvertHTMLToText(str LONGTEXT CHARSET utf8)
           RETURNS LONGTEXT CHARSET utf8
           BEGIN
           DECLARE start, end INT DEFAULT 1;
           LOOP
           SET start = LOCATE("<", str, start);
           IF (!start) THEN RETURN str; END IF;
           SET end = LOCATE(">", str, start);
           IF (!end) THEN SET end = start; END IF;
           SET str = TRIM(INSERT(str, start, end - start + 1, ""));
           END LOOP;
           END');

相关问题