PHP中mysql查询字符串的奇怪行为

时间:2013-11-08 23:30:54

标签: php mysql

我正在玩mysql和PHP并遇到一个非常奇怪的问题:

建立成功的数据库连接后,我为查询设置了两个变量:

$searchcolor = $_SESSION["color"];
$searchprice = $_POST["price"];

$query = "SELECT `toys`.`id` FROM `database`.`toys` WHERE `toys`.`color` = $searchcolor AND `toys`.`price` = $searchprice;";
$result = mysqli_query($link, $query);

echo $query;

此查询无效。回显它时,它会读取正确的字符串,如:

SELECT `toys`.`id` FROM `database`.`toys` WHERE `toys`.`color` = brown AND `toys`.`price` = 1500;

但是,这段代码运行得很好:

$searchcolor = $_SESSION["color"];
$searchprice = $_POST["price"];

$query = "SELECT `toys`.`id` FROM `database`.`toys` WHERE `toys`.`color` = $searchcolor AND `toys`.`price` = 1500;";
$result = mysqli_query($link, $query);

echo $query;

首先我虽然$searchprice没有正确地通过$_POST数组得到它的内容。但是第一个示例中的echo ed搜索查询似乎没问题。

在设置$searchprice = 1500;而非获取$_POST - 值时,它也有效。

我尝试将它转换为整数和东西,但这没效果。

欢呼并感谢每一个暗示!

(代码缩短了!)

玩具表结构:

id int(10)
name varchar(10)
color varchar(10)
price int(20)

编辑:

哇,刚刚发现了一个有趣的发现:

echo "-".$searchprice."-";

给-5 -

if ($searchprice == 5){echo "1";}
if ($searchprice == "5"){echo "2";}

给......什么都没有?!

var_dump($searchprice);

给予字符串(14)“5”

编辑:

echo bin2hex($searchprice);

提供3c6e6f62723e353c2f6e6f62723e(?!)

解决方案:我在提交表单中使用了unicode字符。这打破了一切。课程:避免使用unicode。

1 个答案:

答案 0 :(得分:2)

首先,您应该阅读:How can I prevent SQL injection in PHP?

试试这个:

$q = mysqli_prepare($link, 'SELECT toys.id FROM toys WHERE toys.color = ? AND toys.price = ?');

mysqli_stmt_bind_param($q, 'si', $searchcolor, $searchprice); //d for double

$searchcolor = $_SESSION['color'];
$searchprice = $_POST['price'];

mysqli_stmt_execute($q);

在此之前,您应该正确连接数据库。我看到您在database中使用了FROM

$link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');