簡體   English   中英

mysql過程中的游標循環后的select語句在pdo中沒有輸出,但在phpmyadmin中具有輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM