2012-01-29 17 views
2

我有以下功能來準備和執行和返回結果。我稱之爲準備我的插入查詢並將值綁定到它並返回執行結果。但是當我檢查出功能範圍內受影響的行數時,它會得到-1,但是我的預期記錄已插入到我的表中。我們是否必須總是在全局中定義準備的語句變量?

function prepare_and_run($link,$query_structure){ 
    $stmt = mysqli_prepare($link,$query_structure); 
    mysqli_stmt_bind_param($stmt, 's', 'a string value'); 
    mysqli_stmt_execute($stmt); 
    $result=mysqli_stmt_get_result($stmt); 
    if($result===false && !mysqli_errno($link)) 
     return true; 
    return $result; 
} 
//call the function above 
$link=mysqli_connect(...); 
$result=prepare_and_run($link,"insert into table values(?)"); 
echo mysqli_affected_rows($link); // output: -1 !!! 

我加3行代碼和看到它是固定的:

$dpq_stmt=null; // it is added 
function prepare_and_run($link,$query_structure){ 
    $stmt = mysqli_prepare($link,$query_structure); 
    mysqli_stmt_bind_param($stmt, 's', 'a string value'); 
    mysqli_stmt_execute($stmt); 
    global $dpq_stmt; // it is added 
    $dpq_stmt=$stmt; // it is added 
    $result=mysqli_stmt_get_result($stmt); 
    if($result===false && !mysqli_errno($link)) 
     return true; 
    return $result; 
} 
//call the function above 
$link=mysqli_connect(...); 
$result=prepare_and_run($link,"insert into ..."); 
echo mysqli_affected_rows($link); // output: 1 . it is correct 

但爲什麼呢?我們是否必須總是在全局中定義準備好的語句變量?

回答

0

我不是很肯定PHP也不知道爲什麼你的腳本通過將這些行,但是,回答一般問題的工作,我認爲這是不好的做法,聲明你準備好的聲明爲全局變量。

預處理語句通常需要關閉;不這樣做會導致內存泄漏。全局變量可以在模塊的整個範圍內訪問。雖然簡單腳本可能並不明顯,但一旦代碼崩潰並需要擴展,就很難跟蹤哪部分代碼正在使用全局資源。這是併發災難的一個經典配方。

顯然,如果你的代碼是模塊化足夠,你可能真的需要在某些模塊中聲明一些準備好的語句爲全局語句。但是,當你這樣做的時候,不要忘記你需要一個乾淨的方式來關閉這些資源,並且當你聲明它們是全局的時候,你所做的並不是因爲你是馬虎。

0

有點晚了,但讓我們試着幫忙: 如果準備好的語句和綁定到準備好的語句中的任何變量都沒有被聲明爲同一個作用域,那麼您就需要使用全局變量。

如果你不這樣做,這些變量將不會被準備好的聲明中可見,這將被視爲本地變量 - 它會沉澱爲NULL。

相關問題