[英]select statement after cursor loop in mysql procedure has no output in pdo but has output in phpmyadmin
我正在嘗試運行一個過程,該過程包含一個對選擇查詢的游標循環和此后的輸出選擇。 但是我的“輸出選擇”在pdo調用上沒有輸出,而在phpmyadmin或Workbench中調用過程時卻有輸出。 這是我的程序:
CREATE DEFINER=`root`@`localhost` PROCEDURE `pr_test`(IN `_payment_id` BIGINT (20),IN `_saleId` BIGINT(20))
開始
DECLARE finished INTEGER DEFAULT 0;
DECLARE cv_user_id VARCHAR(250) DEFAULT '';
DECLARE output_id VARCHAR(250) DEFAULT '';
DECLARE `noStocks_Cursor` CURSOR
FOR
SELECT * FROM `noStocks_temp`;
DECLARE exit handler for sqlexception
BEGIN
GET DIAGNOSTICS CONDITION 1
@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
SELECT @p1 AS RETURNED_SQLSTATE, @p2 AS MESSAGE_TEXT;
ROLLBACK;
END;
DECLARE exit handler for sqlwarning
BEGIN
GET DIAGNOSTICS CONDITION 1
@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
SELECT @p1 AS RETURNED_SQLSTATE, @p2 AS MESSAGE_TEXT;
ROLLBACK;
END;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
START TRANSACTION;
DROP TEMPORARY TABLE IF EXISTS `noStocks_temp`;
CREATE TEMPORARY TABLE IF NOT EXISTS
`noStocks_temp` ENGINE=MEMORY
AS
(
SELECT `users`.`id` from `users` where `users`.`id`=108
);
OPEN `noStocks_Cursor`; **// my cursor loop**
noStocks_Loop: LOOP
FETCH noStocks_Cursor INTO cv_user_id;
IF finished=1 THEN
LEAVE noStocks_Loop;
END IF;
UPDATE `payments`
SET `sale_id`=500
WHERE `id`=_payment_id;
SET output_id=cv_user_id;
END LOOP noStocks_Loop;
CLOSE `noStocks_Cursor`; **// my cursor loop end**
SELECT output_id AS output_txt; **// my output select**
COMMIT;
結束
最后這是我的php代碼:
$_dbHandle = ' ';
$_PDOst = '';
function query($query)
{
global $_PDOst;
global $_dbHandle;
$_PDOst = $_dbHandle->prepare($query);
$p_1='1134';
$p_2='7';
$_PDOst->bindParam(1, $p_1, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$_PDOst->bindParam(2, $p_2, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$result=$_PDOst->execute();
$numOfRows = $_PDOst->rowCount();
echo $numOfRows;
}
function connect($address, $account, $pwd, $name)
{
global $_dbHandle;
if(isset($_SESSION['db_connection_counter']))
$_SESSION['db_connection_counter']=$_SESSION['db_connection_counter']+1;
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
try
{
$_dbHandle = new PDO("mysql:host={$address};dbname={$name};charset=utf8", $account, $pwd,$options );
$_dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$_dbHandle->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$_dbHandle->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
return 1;
}
catch (PDOException $e)
{
die("no_connection");
return 0;
}
}
connect('127.0.0.1','root','','db1');
query("CALL `pr_test` (?,?)");
我的php代碼中的“查詢”函數返回0,這是由於最后選擇的過程而應為1的輸出記錄數。
我找到! pdo的此屬性應為true,因為它是默認值,對於SQL注入攻擊,我已將其更改為false。
setAttribute(PDO :: ATTR_EMULATE_PREPARES,true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.