0

我在 GET 数组中遇到撇号问题。我似乎无法逃脱单引号。我已经在一天多的时间里浏览了类似的 SO 主题,但没有运气。我认为这可能与我与数据库的连接有关,就好像我制作了一个普通的未连接的 php 页面,addlashes 和 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 中的错误是我的拼写错误,还是同一问题的延续.

非常感谢。

编辑选择查询(对于没有单引号的 _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,则永远不会转义单引号。

从 b_breed 中选择品种名称、品种类型,其中品种名称 = 'Cirneco dell'Etna' LIMIT 1

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

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

从 b_breed 中选择品种名称、品种类型,其中品种名称 = "Cirneco dell'Etna" 限制 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 回答