$stmt = $db->prepare("CALL pro_test(?,@?)");$stmt->bindParam(1, $name);$stmt->bindParam(2, $return_value, PDO::PARAM_STR, 4000);// 插入一行$name = '成都市';$stmt->execute ();print_r($return_value);
調用預存程序,返回參數怎麼是空的,麼有,查看資料庫,已經成功添加了資料,
直接在資料庫中執行
SET @n = -1;
CALL pro_test("啊是打算",@n);
select @n;
返回的都是正確的參數
回複討論(解決方案)
調用預存程序時,資料庫可能返回多個結果集
依次是:基本的 select 的結果,預存程序1的結果,預存程序2的結果 ....
你的 SQL 指令這是 CALL pro_test(?,@?) 沒有 select 所以只能位於第二個結果集
如果寫作 select CALL pro_test(?,@?) 就位於第一結果集了
當然環境十多變的,你也確實不能準確的知道結果集會擺在哪裡
於是就需要迴圈讀取
do { $rows = $stmt->fetchAll(PDO::FETCH_NUM); if ($rows) { print_r($rows); } } while ($stmt->nextRowset());
調用預存程序時,資料庫可能返回多個結果集
依次是:基本的 select 的結果,預存程序1的結果,預存程序2的結果 ....
你的 SQL 指令這是 CALL pro_test(?,@?) 沒有 select 所以只能位於第二個結果集
如果寫作 select CALL pro_test(?,@?) 就位於第一結果集了
當然環境十多變的,你也確實不能準確的知道結果集會擺在哪裡
於是就需要迴圈讀取
do { $rows = $stmt->fetchAll(PDO::FETCH_NUM); if ($rows) { print_r($rows); } } while ($stmt->nextRowset());
按照你說的,在sql前加上 select, 執行後查看資料庫沒有任何執行結果,不加之前都能成功添加資料,並且沒有報錯。
去掉select,能添加資料,但是 print_r($stmt->fetchAll(PDO::FETCH_NUM)); 返回的結果是Array ( )
,不怎麼懂,希望能講解
你在資料庫管理員中都要
SET @n = -1;CALL pro_test("啊是打算",@n);select @n;
執行3條指令
那麼在 php 中就怎麼簡化成 1 條了呢
你在資料庫管理員中都要
SET @n = -1;CALL pro_test("啊是打算",@n);select @n;
執行3條指令
那麼在 php 中就怎麼簡化成 1 條了呢
那麼在PHP中應該怎麼寫?查了很多資料,PHP.net 中的demo都是錯的· 頭都打了
你在資料庫管理員中都要
SET @n = -1;CALL pro_test("啊是打算",@n);select @n;
執行3條指令
那麼在 php 中就怎麼簡化成 1 條了呢
想通了
$stmt = $db->prepare("CALL pro_test(?,@sp_result);");$stmt->bindParam(1, $name);;$stmt->execute ();$outputArray = $db->query("select @sp_result")->fetch(PDO::FETCH_ASSOC);
謝謝思路