2013-11-08 7 views
0

Я играл вокруг с MySQL и PHP и ударил очень странной проблемой:Странное поведение строки 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 в первом примере кажется прекрасным.

Он также работает при установке $searchprice = 1500; вместо получения $_POST -значения.

Я пробовал отличать его до целого и прочее, но это не сработало.

Приветствия и благодарности за каждый намек на это!

(код укорачивается!)

Структура таблицы игрушек:

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

Edit:

Ого, только что сделал интересное открытие:

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

Придает - 5-

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

Дает ... ничего ?!

var_dump($searchprice); 

дает строку (14) "5"

Edit:

echo bin2hex($searchprice); 

дает 3c6e6f62723e353c2f6e6f62723e

Solution (?!): Я использовал юникод символ в форме представивший. Это сломало все. Урок: Избегайте unicode.

+3

Единственное, что остановит эти запросы от работы, это то, что у вас есть строка в sql для цвета, который не содержит кавычек вокруг него. – Kickstart

+0

Вы должны получить 2 переменные от POST и один от SESSION? – Mihai

+0

Даже с кавычками это не сработает. Переменные заменяются правильно. – user2970781

ответ

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'); 
+0

Даже при размещении $ searchcolor и $ searchprice перед подготовкой это не сработает. Спасибо за ссылку :) – user2970781

+0

Вы попробовали этот запрос вручную? Есть ли какие-то результаты? Возможно, есть какие-то ошибки? – speccode

+0

В phpmyadmin эхо-запрос работает просто отлично :( – user2970781

Смежные вопросы