2017-01-31 55 views
-4

请在下面的PHP脚本中帮助修复“SQLSTATE [HY000]:一般错误:”。另外,请参阅MySQL脚本。PHP MySQL PDO SQLSTATE [HY000]:一般错误

<?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();”没有帮助。

请帮忙。

感谢

+0

为什么你们会不停地切换符? –

+0

什么是@inOutParam?你在哪里申报? –

回答

0

试试这个,行

$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"; 
} 
+0

这将仅提取第一个结果集。 –

+0

@Paul Spiegel,我已编辑帖子 – rescobar

+0

看看[文档](http://php.net/manual/en/pdostatement.nextrowset.php) - OPs代码几乎是该示例的精确副本。 –

相关问题