addslashes不适用于$ _GET单引号

时间:2013-01-30 14:05:02

标签: php mysqli escaping

我在GET数组中遇到了撇号问题。我似乎无法逃脱单引号。我已经在类似的SO主题上拖了一天,现在没有运气。我认为这可能与我与数据库的连接有关,好像我创建一个普通的未连接的php页面,addslashes和str_replace成功地转义GET变量中的单引号(mysqli_real_escape_string没有,因为没有数据库连接)。

PHP 5.2.17 Mysql 5.5.23 Magic_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中的错误是我的错别字还是延续同样的问题。

非常感谢。

EDIT 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>";
        }
    }

我已经尝试在查询中包含addslashes,mysqli_real_escape_string和str_replace(不是同时)和$ _GET,但没有效果。如果我回显$ q,那么单引号永远不会被转义。

从b_breed中选择breed_name,breed_type,其中breed_name ='Cirneco dell'Etna'LIMIT 1

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

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

从b_breed中选择breed_name,breed_type,其中breed_name =“Cirneco dell'Etna”LIMIT 1

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

编辑解决了!

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

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

1 个答案:

答案 0 :(得分:1)

您可以查看从GET获得的内容

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