2012-02-28 10 views
0

場合、私は利用できませんを返すように望んでいた一部のデータが存在していないが、私は何かが間違っていると思うとき私のコードでエルスとMySQLとPHPエラー

$id=$_GET["id"]; 
$sql="SELECT * FROM book WHERE id = '".$id."' AND type = 'new'"; 
if(!empty($sql)) 
{ 
    $result = mysql_query($sql); 
    $row = mysql_fetch_assoc($result); 
    echo utf8_encode($row['bookreview']); 
} 
else 
{ 
    echo "<div style='text-align: center; background-color: rgb(255, 255,255);'><font style='color: rgb(204, 0, 0);' size='+3'><span style='font-weight: bold;'>review not not available.</span></font><br>"; 
} 

レビューが利用可能な場合であればながら、見直しを返します利用できない "レビューは利用できません"はエコーしません。

+1

if文に$ sql値を指定し、すべてにデータがある場合は、代わりに$ resultを使用します。 – Juanma

答えて

0

実際に文字列が空であるかどうかをチェックしています、結果セットではありませんか?

!empty("any string") 

は常にtrueを返します。

2

$sql変数には、空であるかどうかをチェックする前に割り当てられた文字列が含まれています。この場合は決して空ではありません。

おそらくあなたがしようとしているのは、クエリから返された結果の数を確認することですか?そのためには、最初にクエリを実行する必要があります。ここではmysqliのと(私の頭の上から)簡単な例です:

$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db"); 

$id = $_GET["id"]; 
$sql = "SELECT * FROM book WHERE id = '".$id."' AND type = 'new'"; 

// Run query 
if ($result = $mysqli->query($sql)) 
{ 
    // We got results 
    var_dump($result); 
    $result->close(); 
} 
else 
{ 
    // No results 
    echo("Oops. Nothing here."); 
} 

SQLインジェクションを回避するために、私はPDOとどのように準備された文の記述方法についての学習をお勧めします。

2
$id = (int) $_GET['id']; // important ! 
$sql = 'SELECT * FROM book WHERE id = ' . $id. ' AND type = "new"'; 
$result = mysql_query($sql); 

if(mysql_num_rows($result) > 0) { 
    $row = mysql_fetch_assoc($result); 
    echo utf8_encode($row['bookreview']); 
} else { 
    echo "<div style='text-align: center; background-color: rgb(255, 255,255);'><font style='color: rgb(204, 0, 0);' size='+3'><span style='font-weight: bold;'>review not not available.</span></font><br>"; 
} 

それはTUは指定されたタイプ(ここではint)へのパラメータは、SQLインジェクションを防ぐためにGETキャストが重要です!

mysql_num_rowsを使用すると、クエリで返された行の数を確認できます。あなたはそれを確認するためにクエリを行う必要があります。 $sql変数が空であるかどうかを確認することは、文字列で常に「完全」であるため、無駄です。

+0

num行の比較は結果をチェックするよりも高価ですが、動作するはずです。あなたはまた、SQLインジェクションに対して警戒しますが、あなたの答えにそれを説明してください! – markus

+0

こんにちは、私は取得しています警告:mysql_num_rows()は、パラメータ1はリソース、ブール値は – meandme

+0

で与えられます@ markus-tharkun私はそれを説明しました。 @meandmeクエリに何らかのエラーがあると、 'mysql_query'は' false'を返します。 – hsz

0

$sqlは、決して設定した文字列ではありません。

$id=$_GET["id"]; 
$sql="SELECT * FROM book WHERE id = '".intval($id)."' AND type = 'new'"; 
$result = mysql_query($sql); 
if(!empty($result) and mysql_num_rows($result) > 0) 
{ 
    $row = mysql_fetch_assoc($result); 
    echo utf8_encode($row['bookreview']); 
} 
else 
{ 
    echo "<div style='text-align: center; background-color: rgb(255, 255,255);'><font style='color: rgb(204, 0, 0);' size='+3'><span style='font-weight: bold;'>review not not available.</span></font><br>"; 
} 
+0

あなたは悪い習慣をコピー&ペーストしています。このコードはSQLインジェクションに対して脆弱です。 – markus

+0

私はコードを編集するために質問からコピーします。何が問題なのですか?あなたが別の答えからコピーしたことを提案した場合は、あなたが間違っています。私たちは10秒以内に答えました。あなたはSQLインジェクションについて正しいですが..私はそれを編集します..ありがとう – SERPRO

+0

ええ、それはすべて意味しています...残りの部分をコピーすることはもちろんOKです。 – markus