0

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);
4

1 に答える 1

1

GETから何を得ているかを確認できます

試す

$string = $_GET['breed'];
for ($i=0;$i<strlen($string);$i++) {
    echo '<br>'.$string[$i].' : '.ord($string[$i]);
}
于 2013-01-30T14:30:35.373 に答える