【问题标题】:PHP MySQL PDO SQLSTATE[HY000]: General errorPHP MySQL PDO SQLSTATE[HY000]:一般错误
【发布时间】:2017-06-17 10:08:24
【问题描述】:

请帮助修复以下 PHP 脚本中的“SQLSTATE[HY000]:一般错误:”。另外,请参考 MySQL 脚本以防万一。

<?php

# MySQL 
$host = 'localhost';
$username = 'root';
$password = '';
$dbname = 'procdb';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "Connected to MySQL Server successfully." . "\n";

    $sql = "CALL prepend('abcdefg', @inOutParam);";
    $stmt = $pdo->query($sql);
    do {
        $rows = $stmt->fetchAll(PDO::FETCH_NUM);
        if ($rows) {
        foreach($rows as $row) {
              print($row[0] . "\n");
            }  
        }
    } while ($stmt->nextRowset());

} catch (PDOException $e) {
    #die("Could not connect to the database $dbname :" . $e->getMessage());
    $error = $e->getMessage();
    echo $error . "\n";
} catch (Exception $e) {
    $error = $e->getMessage();
    echo $error . "\n";
} finally {
    $pdo = null;
    echo "Connection closed." . "\n";
}   

?>

这是 MySQL 脚本:

DROP DATABASE IF EXISTS procdb;
DELIMITER $$
CREATE DATABASE procdb;$$
DELIMITER ;

USE procdb;
DROP PROCEDURE IF EXISTS prepend;
DELIMITER $$
CREATE PROCEDURE prepend
(
 IN inParam VARCHAR(255), 
 INOUT inOutParam INT
)
BEGIN
 DECLARE z INT;
 SET z = inOutParam + 1;
 SET inOutParam = z;
 SELECT inParam;
 SELECT CONCAT('zyxw', inParam);
END;$$
DELIMITER ;

USE procdb;
CALL prepend('abcdefg', @inOutParam);

/*
# Output 
// (FieldName1 and its value)
inParam
'abcdefg'
// (FieldName2 and its value)
CONCAT('zyxw', inParam)
'zyxwabcdefg'    
*/

错误的原因是什么?注意添加“$stmt->close();”或“$stmt->closeCursor();”没有帮助。

请帮忙。

谢谢

【问题讨论】:

  • 为什么总是切换分隔符?
  • 什么是@inOutParam?你在哪里声明的?

标签: php mysql pdo


【解决方案1】:

试试这个,行

 $rows = $stmt->fetchAll(PDO::FETCH_NUM);

在While循环之外

try {
 $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 echo "Connected to MySQL Server successfully." . "\n";
 $sql = "CALL prepend('abcdefg', @inOutParam);";
 $stmt = $pdo->query($sql);
 $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC);
 foreach ($rows as $row) {
    foreach ($row as $col) {
        print $col . "\n";
    }
 }
 $stmt->nextRowset();
 $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC);
 foreach ($rows as $row) {
     foreach ($row as $col) {
        print $col . "\n";
    }
  }
 } catch (PDOException $e) {
   #die("Could not connect to the database $dbname :" . $e->getMessage());
   $error = $e->getMessage();
   echo $error . "\n";
 } catch (Exception $e) {
   $error = $e->getMessage();
   echo $error . "\n";
 } finally {
   $pdo = null;
   echo "Connection closed." . "\n";
 } 

【讨论】:

  • 这只会获取第一个结果集。
  • 查看documentation - OPs 代码几乎是示例的精确副本。
  • 其实给出的代码sn-p是基于PHP文档的,并没有解决“SQLSTATE[HY000]: General error”的问题。请帮助提供进一步的输入。
  • @rescobar,根据您的代码的输出与预期不符:已成功连接到 MySQL 服务器。 abcdefg abcdefg 连接已关闭。预期输出:成功连接到 MySQL 服务器。 abcdefg zyxwabcdefg 连接已关闭。
猜你喜欢
  • 1970-01-01
  • 2013-06-20
  • 2011-12-27
  • 2012-10-24
  • 2012-10-25
  • 2014-12-31
  • 2021-09-10
相关资源
最近更新 更多