2017-01-31 2 views
-4

Помогите исправить «SQLSTATE [HY000]: общая ошибка:« в следующем скрипте PHP. Кроме того, обратитесь к скрипту 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); 

Снаружи Хотя петля

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

Посмотрите на [documentation] (http://php.net/manual/en/pdostatement.nextrowset.php) - код OPs - это почти точная копия примера. –

Смежные вопросы