我在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);
答案 0 :(得分:1)
您可以查看从GET获得的内容
试
$string = $_GET['breed'];
for ($i=0;$i<strlen($string);$i++) {
echo '<br>'.$string[$i].' : '.ord($string[$i]);
}