MySQL 存储过程奇怪的行为 PHP

标签 mysql stored-procedures dynamic-sql

这是我的 MySQL 存储过程:

CREATE DEFINER = 'c4_awuser'@'%'
PROCEDURE c4_awdb.aw_spZAAAOttieniDataTables(IN _identificativoTabella VARCHAR(255))
BEGIN

  DECLARE finito INT DEFAULT 0;
  DECLARE nomeColonna VARCHAR(200) DEFAULT '';
  DECLARE titoloColonna VARCHAR(200) DEFAULT '';
  DECLARE queryColonne LONGTEXT DEFAULT 'SELECT ';
  DECLARE _nomeVista VARCHAR(255);
  DECLARE curColonne CURSOR FOR
    SELECT
      COLUMN_NAME,
      COALESCE(nome_campo, COLUMN_NAME) AS nome_campo
    FROM information_schema.columns
      LEFT JOIN aw_tbZAAEGestioneTabelleDati
        ON ZAAEcvVistaAssociata = _nomeVista
      LEFT JOIN aw_tbZAACCampi
        ON nome_campo_db = COLUMN_NAME
        AND tabella = ZAAEcvNomeTabella
    WHERE table_name = _nomeVista;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET finito = 1;

  SELECT
    ZAAEcvVistaAssociata INTO _nomeVista
  FROM aw_tbZAAEGestioneTabelleDati
  WHERE ZAAEcvIdentificativoTabella = _identificativoTabella;

  IF _nomeVista IS NOT NULL AND EXISTS (SELECT
    DISTINCT 1
      FROM information_schema.columns
      WHERE table_name = _nomeVista) THEN

    OPEN curColonne;
 
    ciclaColonne: LOOP
        FETCH curColonne INTO nomeColonna,titoloColonna;
        IF finito = 1 THEN 
          LEAVE ciclaColonne;
        END IF;
        
        SET queryColonne = CONCAT(queryColonne,nomeColonna,' AS \'',titoloColonna,'\',');
        
    END LOOP ciclaColonne;

    CLOSE curColonne;
    
    IF RIGHT(queryColonne,1) = ',' THEN
        SET queryColonne = LEFT(queryColonne,LENGTH(queryColonne)-1);
    END IF;
    
    SET queryColonne = CONCAT(queryColonne,' FROM ',_nomeVista);

    SET @sql = queryColonne;
    PREPARE dynamic_statement FROM @sql;
    EXECUTE dynamic_statement;
    DEALLOCATE PREPARE dynamic_statement;

  END IF;
    
END

有什么错误吗? 如果我在 MySQL 客户端中执行它,它会给我 2 条记录(正确),但如果我从 PHP 执行它,它会给我 0 条记录,但没有错误。 我传递一个 id 作为参数,例如“elenco_corsi”。我在 aw_tbZAAEGestioneTabelleDati 中搜索他的 View 是什么,然后我使用系统表来获取 View 的字段,我构建一个查询并通过语句执行它。

<小时/>

更新

如何从 PHP 调用过程。 (require DB(); 定义 $conn)

require DB();
$id_datatable = "elenco_corsi";
$stmt = $conn->prepare("CALL aw_spZAAAOttieniDataTables(?);");
$stmt->bind_param("s", $id_datatable);
if($stmt->execute()) {
    $result = $stmt->get_result();

    $stmt->close();
    $conn->close();

    echo "<br />Numero righe: ".$result->num_rows."<br /><br />";

    if($result && $result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            echo "yes";
            $dati[] = $row;
        }
        $resp = new stdClass();
        $resp->esito = 1;
        $resp->dati = $dati;
    } else {
        // it enter here
        $resp = new stdClass();
        $resp->esito = 20;
        $resp->dati = $dati;
    }
} else {
    $resp = new stdClass();
    $resp->esito = 30;
    $resp->dati = $dati;
}

最佳答案

游标和准备好的语句不能很好地协同工作。您可以使用 MySQLi 的 query 方法来代替:

$table = $conn->real_escape_string($id_datatable);
$sql = "CALL aw_spZAAAOttieniDataTables('$table')";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  // Loop through the rows
  while($row = $result->fetch_assoc()) {
    // handle the $row
  }
}

关于MySQL 存储过程奇怪的行为 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59518942/

相关文章:

php - 如何制作轮询?或者除了 Round Robin 之外还有更简单的方法吗?

php - 按匹配百分比将用户偏好与对象属性相匹配

mysql - 使用 innobackupex 远程备份

php - 在 mariadb 存储过程中设置 PHP 变量; SQLSTATE[42S22] : Column not found

sql - 如何按月(("Both"YEAR & MONTH)对表进行分区并自动创建每月分区?

java - 在java中获取java.lang.ClassNotFoundException : com. mysql.jdbc.Driver

stored-procedures - MySQL存储过程移植?

php - 优化使用 Magento 的网站

sql-server - SQL - 语法不正确,需要 ID 或 QUOTED_ID

sql - 如何在 pl sql 脚本中打印 select 语句?