添加斜杠不适用于 $_GET 单引号


addslashes not working for $_GET single quotes

我在 GET 数组中的撇号方面遇到了问题。我似乎无法逃脱单引号。我已经在类似的 SO 主题中搜寻了一天多了,但没有运气。我认为这可能与我与数据库的连接有关,就好像我制作了一个普通的未连接的 php 页面既添加斜杠又str_replace成功地转义了 GET 变量中的单引号(mysqli_real_escape_string没有,因为没有数据库连接)。

菲律宾比索 5.2.17Mysql 5.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中的错误是我的错别字,还是同一问题的延续。

非常感谢。

编辑选择查询(对于没有单引号的_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>";
        }
    }

我尝试在查询中包含 $_GET 的添加斜杠、mysqli_real_escape_string 和 str_replace(不是同时),但没有效果。如果我呼应$q,单引号永远不会被转义。

选择breed_name,breed_type b_breed其中breed_name = 'Cirneco dell'Etna' 限制 1

奇怪的是,如果我切换双引号和单引号,所以我有:

$q = 'SELECT breed_name, breed_type from b_breed 
where breed_name = "' . $_GET['breed'] . '" 
LIMIT 1';

选择breed_name,breed_type b_breed,其中breed_name = "Cirneco dell'Etna" 限制 1

它仍然不返回页面上的行,尽管回显的$q将在 PHPMyAdmin 中返回行。

编辑 解决!

它将数据库中的 ' 更改为 ASCII 字符。添加以下内容将其转换回 ',然后可以对其进行转义:

$_GET['breed'] = htmlspecialchars_decode($_GET['breed'], ENT_QUOTES);

你可以检查你从GET得到了什么

尝试

$string = $_GET['breed'];
for ($i=0;$i<strlen($string);$i++) {
    echo '<br>'.$string[$i].' : '.ord($string[$i]);
}