2017-08-01 7 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またはカスタム例外ハンドラのいずれかを使用する必要がありますが、それは指摘する価値があります。また、あなたの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(); 

display_errors = Offlog_errors = Onを行うことを確認してください。しかし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につながりました。これは、get_resultにmysqlnd拡張機能がインストールされていないことを示唆しています。 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 *を使用しないように非常にお勧めです。

個人的には、mysqliの代わりにPDOを使うことをお勧めします。私は構文がmysqliのものよりも面白いと思っています。 Here'sあなたをPDOに紹介する良いチュートリアルです。

関連する問題