0

特定の大会で特定のレースの結果を取得しようとしています。

raceresult.php?meet=<i>August Meet</i>&race=<i>Allowance Fillies 2yo</i>

最初のクエリから大会とレースが表示され、結果の一部が表示されます。例えば:

これは機能します

raceresult.php?meet=meet=2013 OJCR Australian Derby&race=Allowance - 9f on turf 3yo

動作しません

raceresult.php?meet=2009 Gulfstream Park Grand Opening Meet&race=Flying Stakes - Grade I, 3 yr old+, 8F on dirt

2 番目の例でエラーを引き起こす文字はありますか? 私はその問題を簡単に解決することができますが、他のURLがうまく機能しているのに、そのURLが機能していない理由はよくわかりません.

私のコードは次のとおりです。

<?php 

$sql = "SELECT * FROM racing WHERE `meet` = '$meet' LIMIT 1"; 
$query = mysql_query($sql) or die( mysql_error() . "<br />" . $sql );
while($row = mysql_fetch_array($query)){ 

$date= $row['date'];
echo "<h2><strong>$meet</strong> ($date)</h2>";
echo "<b>$race</b><br>";
}
?>

<?php 

$sql = "SELECT * FROM racing WHERE `meet`='$meet' and `race`='$race' ORDER BY place"; 
$query = mysql_query($sql) or die( mysql_error() . "<br />" . $sql );
while($row = mysql_fetch_array($query)){ 

$place= $row['place'];
$horse= $row['horse'];
$farm= $row['farm'];

echo"$place. $horse owned by $farm";

}
?>
4

2 に答える 2

0

開始点として、URL の GET 変数を作成するときは、それらをパススルーurlencodeして、スペースを使用できるものに変換する必要があります。

このページのスクリプトに入ったら、 を使用urldecodeして、エンコードされた文字を通常の文字に置き換えます。(このビットは必要ないかもしれません - 試してみてください)

次に、それらを通過させてmysql_escape_string、うまく機能させ、SQL インジェクションの可能性を下げます。

作成された文字列を画面またはログにエコーして、何が試行されているかを正確に$sql確認できるようにしてください。これは、GET 変数が正しく渡されていることを確認するのに役立ちます。また、この SQL を MySQL セッションで直接実行して、SQL が正しいことを確認することもできます。

最後に、mysql_関数の使用を停止します。関数は非推奨です。mysqli_またはPDOoへの道です

于 2013-08-28T14:41:18.110 に答える
0

+URLがスペース文字にデコードされるため、2 番目の URL はおそらく正しくありません。+代わりにそれをエンコードする必要があるため、スペース文字ではなく%2Bリテラルとして扱われます。+

スペース文字にマングルされているため、比較するため、クエリ文字列は決して一致しません。

database:   ... Grade I, 3 yr old+, 8F ...
query   :   ... Grade I, 3 yr old , 8F ...
                                 ^---note the space
于 2013-08-28T14:41:32.173 に答える