GET配列のアポストロフィに問題があります。一重引用符をエスケープできないようです。私は1日以上、同様のSOトピックを調べてきましたが、運がありませんでした。これは、データベースへの接続に関係していると思います。まるで、接続されていないプレーンなphpページをaddslashesとstr_replaceの両方でGET変数の単一引用符を正常にエスケープするようにしています(データベース接続がないため、mysqli_real_escape_stringはエスケープしません)。
PHP 5.2.17Mysql5.5.23Magic_quotesはオフです
接続:
DEFINE ('database', 'dbname');
DEFINE ('user', 'dbusername');
DEFINE ('pass', 'dbpassword');
DEFINE ('host', 'localhost');
$dbc = @mysqli_connect (host, user, pass, database) OR die ('Could not connect to database: ' . mysqli_connect_error() );
データベースが接続されているようです。一重引用符が含まれていないGET変数を含むクエリを選択すると正常に機能します。しかし、今では一重引用符を含むGETが渡されると、それを逃れることができないようです。
print_r($_GET);
echo "<br><br>";
$text = "O'Reilly";
echo "Normal variable called text: " . $text . "<br>
addslashes(): " . addslashes($text) . "<br>
mysqli_real_escape_string(): " . mysqli_real_escape_string($dbc, $text) . "<br>
str_replace(): " . str_replace("'", "\'", $text) . "<br>
<br>";
echo "_GET variable: " . $_GET['breed'] . "<br>
addslashes(): " . addslashes($_GET['breed']) . "<br>
mysqli_real_escape_string(): " . mysqli_real_escape_string($dbc, $_GET['breed']) . "<br>
str_replace(): " . str_replace("'", "\'", $_GET['breed']) . "<br>
<br>";
$_GET['breed'] = "O'Conner";
echo "_GET variable with new value: " . $_GET['breed'] . "<br>
addslashes(): " . addslashes($_GET['breed']) . "<br>
mysqli_real_escape_string(): " . mysqli_real_escape_string($dbc, $_GET['breed']) . "<br>
str_replace(): " . str_replace("'", "\'", $_GET['breed']) . "<br>
<br>";
与える:
Array ( [breed] => Cirneco dell'Etna )
Normal variable called text: O'Reilly
addslashes(): O\'Reilly
mysqli_real_escape_string(): O\'Reilly
str_replace(): O\'Reilly
_GET variable: Cirneco dell'Etna
addslashes(): Cirneco dell'Etna
mysqli_real_escape_string(): Cirneco dell'Etna
str_replace(): Cirneco dell'Etna
_GET variable with new value: O'Conner
addslashes(): O\'Conner
mysqli_real_escape_string(): O\'Conner
str_replace(): O\'Conner
Cirneco dell'Etnaの一重引用符は間違いなく一重引用符であり、 `などではありません。urlencode()とurldecode()も試しました。スペースを+に置き換えましたが、一重引用符をエスケープしませんでした。GETは、ユーザーフレンドリーなURL(たとえば、ユーザー名と(この場合)品種名)を作成するために一重引用符を必要とします。Cirneco dell%39Etnaは直感的ではありません。複雑なサイトではありませんが、所有権がサイトの主要部分であるため、一重引用符が多く発生するので、何が起こっているのかを調べたいと思います。
私はPDOに切り替えようとしましたが、それは私を超えていることに気づきました-私は初心者プログラマーであり、PDOでの私の試みはトラブルシューティングするのに気が遠くなるようなものでした-PDOのエラーが私のタイプミスなのか、これと同じ問題の継続なのかわかりません。
どうもありがとう。
編集selectクエリ(一重引用符がない_GET変数に対して期待どおりに機能する)は、次のように構成されます。
$q = "SELECT breed_name, breed_type from b_breed
where breed_name = '" . $_GET['breed'] . "'
LIMIT 1";
$result = mysqli_query($dbc,$q);
if($result->num_rows == 0)
{
}
else
{
$row_breed = mysqli_fetch_array($result, MYSQLI_ASSOC);
{
echo "<h1>" . $row_breed['breed_name'] . " - " . $row_breed['breed_type'] . "</h1>";
}
}
addlashes、mysqli_real_escape_string、str_replace(同時にではない)をクエリ内の$ _GETに含めてみましたが、効果はありませんでした。$ qをエコーすると、一重引用符がエスケープされることはありません。
SELECT Breed_name、Breed_type from b_breed wherebreed_name ='Cirneco dell' Etna'LIMIT 1
奇妙なことに、二重引用符と一重引用符を切り替えると、次のようになります。
$q = 'SELECT breed_name, breed_type from b_breed
where breed_name = "' . $_GET['breed'] . '"
LIMIT 1';
SELECT Breed_name、Breed_type from b_breed wherebreed_name = "Cirneco dell'Etna" LIMIT 1
エコーされた$qはPHPMyAdminに行を返しますが、それでもページに行は返されません。
編集解決しました!
データベースの'をASCII文字に変更していました。以下を追加すると、それが'に変換され、エスケープされる可能性があります。
$_GET['breed'] = htmlspecialchars_decode($_GET['breed'], ENT_QUOTES);