私が使用している (php_fastcgi5 を実行している) サーバーでは、このディレクティブを含むルート ディレクトリに .htaccess ファイルがあり、magic_quotes_gpc をオフにします。
php_flag magic_quotes_gpc off
phpinfo() の出力は、magic_quotes_gpc のローカル値が実際にオフであることを報告します。(ただし、マスター値は「オン」です。)
これが正確に報告されているかどうかはわかりません。1つはこの投稿を読んだため、もう 1 つは、PDO プリペアード ステートメントを使用する次のコードでも、データベース レコードにバックスラッシュが挿入されたままになっているためです。
<?php
$db = new PDO('mysql:host=example.com;dbname=my_database_name;charset=utf8', 'database_user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$output = '<p>Post some text which includes some apostrophes:</p><form name="form" action="test.php" method="post"><input type="text" size="60" name="string" value="The server\'s not behaving as it\'s supposed to." /><br /><br /><input type="submit" value="Post" /></form><br />----------<br />';
if (isset($_POST['string'])) {
$PostedString = $_POST['string'];
$InsertQuery = $db->prepare("INSERT INTO `test` (string) VALUES (?)");
$SuccessfulInsertion = $InsertQuery->execute(array($PostedString));
if ($SuccessfulInsertion) {
$ReadStatement = $db->prepare('SELECT * FROM `test` ORDER BY `id`');
$ReadStatement->execute();
$ReadStatement->setFetchMode(PDO::FETCH_ASSOC);
while($row = $ReadStatement->fetch()) {
$ThisString = $row['string'];
$output .= '<p>'.$ThisString.'</p>'.$CR;
}
}
}
echo $output;
?>
このコードを使用してデータベースに挿入されたテキストが、アポストロフィの前にスラッシュが追加された db レコードになる理由を知っている人はいますか?
PHP が php_fastcgi5 として実行されているためですか (つまり、magic_quotes_gpc をオフにする .htaccess ディレクティブが機能していないためですか)? もしそうなら、回避策はありますか?(php.ini ファイルにはアクセスできません。)