2017-08-01 65 views
1

我想創建一個簡單的PHP腳本,使用預處理語句選擇數據。目前,我正在使用this教程作爲源代碼。當我呼叫我的腳本時,我在error.log中沒有錯誤,但沒有顯示數據。這裏是我的腳本:簡單的PHP選擇與準備好的語句顯示沒有結果

<?php 
$servername = "xxx"; 
$username = "xxx"; 
$password = "xxx"; 
$dbname = "xxx"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$stmt = $conn->prepare("SELECT * FROM Regions WHERE id=?"); 
$stmt->bind_param("i", $_POST['id']); 
$stmt->execute(); 
$result = $stmt->get_result(); 
if($result->num_rows > 0) { 
    while($row = $result->fetch_assoc()) { 
    $name[] = $row['name']; 
    $center[] = $row['center']; 
    $content_string[] = $row['content_string']; 

    } 
} 
$stmt->close(); 
echo $name; 
echo $center; 
echo $content_string; 

$conn->close(); 
?> 

我的結構是這樣的:

enter image description here

我試圖通過調用 http://URL/php/protected.php?id=1http://URL/php/protected.php無濟於事訪問輸出。我已經縮小了錯誤發生的原因,因爲if($result->num_rows > 0)從未得到評估。從那裏,我認爲這個錯誤必須在我的SQL語句中。

+0

'$ stmt-> execute'是真是假?您是否檢查過執行中的錯誤? – chris85

+0

@ chris85我不確定。我該如何檢查? – taurus

+0

如果這是你打算做的事'int'不能保存48位小數位。 – chris85

回答

-1

您正在用查詢參數調用腳本 - 如果您在瀏覽器中執行該操作,該操作可能是GET,但會從$ _POST中檢索值 - 此外,您應該確保數組索引在綁定之前已存在 - 這很可能是你調用bind_param()時$ _POST ['id']不存在的問題。

運行查詢之前,您應該測試一下:

if (isset($_POST['id']) { 
    // ... do the query... 
} 
4

我其實該教程的作者笑。你檢查了錯誤處理部分嗎?您應該能夠通過以下方式獲得有意義的消息。

例如

if (!$stmt = $conn->prepare("SELECT * FROM Regions WHERE id=?")) 
echo "Prepare Error: ($conn->errno) $conn->error"; 
if (!$stmt->bind_param("i", $_POST['id'])) 
    echo "Binding Parameter Error: ($conn->errno) $conn->error"; 
if (!$stmt->execute()) 
echo "Execute Error: ($stmt->errno) $stmt->error"; 
if (!$stmt->get_result()) //Only for select with get_result() 
echo "Getting Result Error: ($conn->errno) $conn->error"; 
if (!$stmt->store_result()) //Only for select with bind_result() 
echo "Storing Result Error: ($conn->errno) $conn->error"; 
$stmt->close(); 

編輯:一個更優雅的方式做,這將與異常處理。請記住,如果使用mysqli_report()之前創建連接,那麼它會輸出您的數據庫密碼的錯誤。無論如何,您應該使用try/catch或自定義異常處理程序打印到您的錯誤日誌中,但值得指出。此外,確保做到display_errors = Offlog_errors = On在php.ini

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 
$stmt = $conn->prepare("SELECT * FROM Regions WHERE id=?"); 
$stmt->bind_param("i", $_POST['id']); 
$stmt->execute(); 
$result = $stmt->get_result(); 
if($result->num_rows > 0) { 
    while($row = $result->fetch_assoc()) { 
    $name[] = $row['name']; 
    $center[] = $row['center']; 
    $content_string[] = $row['content_string']; 

    } 
} 
$stmt->close(); 

但作爲RichGoldMd指出的那樣,你也應該做類似下面的,這是我的經驗,錯誤很常見的原因。

$id = (!empty($_POST['id']) ? $_POST['id'] : ''); 
0

您是否擁有正在運行的服務器(VPS或專用服務器),還是共享主機環境?當我試圖運行你的代碼,我得到這個錯誤:

PHP Fatal error: Call to undefined method mysqli_stmt::get_result() 

get_result線致命錯誤肯定會阻止if($result->num_rows > 0)被評估。該錯誤消息導致我到this question,這表明如果沒有安裝mysqlnd擴展名,就不能使用get_result。在Debian/Ubuntu上使用PHP 5,這將是php5-mysqlnd包。

如果您無法安裝該擴展程序,並且確實是您的問題,那麼您將無法使用get_result,這意味着您需要使用更爲醜陋的bind_result方法,該方法看起來像這樣的:

<?php 
$servername = "xxx"; 
$username = "xxx"; 
$password = "xxx"; 
$dbname = "xxx"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$stmt = $conn->prepare("SELECT name, center, content_string FROM Regions WHERE id=?"); 
$stmt->bind_param("i", $_POST['id']); 
$stmt->execute(); 
$stmt->bind_result($row_name, $row_center, $row_content_string); 
if($result->num_rows > 0) { 
    while($row = $result->fetch_assoc()) { 
    $name[] = $row_name; 
    $center[] = $row_center; 
    $content_string[] = $row_content_string; 

    } 
} 
$stmt->close(); 
echo $name; 
echo $center; 
echo $content_string; 

$conn->close(); 
?> 

這是強烈建議使用bind_result時,由於數據庫退換事宜列的順序不使用SELECT *

就我個人而言,我建議考慮使用PDO而不是mysqli,因爲我認爲語法比mysqli更友好,並且像上面描述的那樣少了許多「陷阱」。 Here's一個體面的教程向你介紹PDO。