2015-06-02 2 views
1

У меня есть таблица, где я держу клиентов. И еще где я держу продажи.Запрос не возвращает ожидаемые результаты

Когда я откладываю я продолжаю продавать идентификатор клиента, и когда я показываю в списке, я показать клиент с идентификатором

Проблема, когда ищет продажу не оставить меня в покое тех, вошедшего клиент показывает мне все записи

$query = "SELECT * 
    FROM ventas 
    WHERE idusuario = $_SESSION[k_username] 
    union 
    SELECT * 
    FROM reparaciones 
    WHERE marca LIKE '%" . $name . "%' 
    OR modelo LIKE '%" . $name ."%'" ; 

И это

$query="SELECT * 
    FROM ventas 
    WHERE idusuario = $_SESSION[k_username] 
    marca LIKE '%" . $name . "%' 
    OR modelo LIKE '%" . $name ."%'"; 

Но ни один из них не работает

+1

Вам понадобится '$ _SESSION [k_username]' в кавычках, например 'idusuario = '$ _SESSION [k_username]'' Какова структура таблицы? – chris85

+0

@ chris85 Строго, да, но PHP позволяет избежать этого. К сожалению. –

+0

Я имею в виду как строку SQL. Я должен отредактировать, я думаю .. – chris85

ответ

0

Вы пробовали скобки вокруг встроенных переменных в строку запроса (например)?

$query="SELECT * FROM ventas WHERE idusuario = {$_SESSION[k_username]} marca LIKE '%" . $name . "%' OR modelo LIKE '%" . $name ."%'"; 
2

Добро пожаловать в СО.

Я бы очень рекомендовал вам провести некоторое исследование на SQL Injection и Prepared Statements. Я рассмотрю ваш вопрос так же, как и без учета уязвимостей безопасности, с тем, как вы его устанавливаете.

Ваши строки запроса не действуют, попробуйте следующее:

$query = "SELECT * 
    FROM ventas 
    WHERE idusuario = '". $_SESSION['k_username'] ."' 
    UNION 
    SELECT * 
    FROM reparaciones 
    WHERE marca LIKE '%". $name ."%' 
     OR modelo LIKE '%". $name ."%' 
    "; 

и

$query = "SELECT * 
    FROM ventas 
    WHERE idusuario = '". $_SESSION['k_username'] ."' 
     OR marca LIKE '%". $name ."%' 
     OR modelo LIKE '%". $name ."%' 
    "; 

Кроме того, в первом запросе вы используете соединение, пожалуйста, убедитесь, что обе части этого возвращения запроса такое же количество столбцов.

UPDATE

Примеры SQL инъекций можно найти по всему Интернету (в том числе на странице php.net ручного я связан выше). Из примера, который вы указали в OP, неясно, обрабатываете ли вы свои данные, а именно: $ _SESSION ['k_username'] и $ name, и поскольку вы включаете их непосредственно в строку запроса, это могут быть точки впрыска.

Например, если $ название происходит с пользовательским вводом (скажем, с помощью поисковой формы) и принадлежности пользователя:

x'; DELETE FROM usuario WHERE 1=1; -- 

Теперь, когда это используется в вашем втором запросе, строка запроса будет (только используя 123 для идентификатора пользователя в качестве примера):

SELECT * FROM ventas WHERE idusuario = 123 OR marca LIKE '%x'; DELETE FROM usuario WHERE 1=1; --%' OR modelo LIKE '%". $name ."%' 

Теперь, когда этот запрос запускается, ваша пользовательская таблица становится пустой.

Это, конечно, только один пример. Возможно, ваша пользовательская таблица не называется «usuario» ... Факт по-прежнему остается фактом, что у вас есть уязвимость, и это оставляет для кого-то возможность проникнуть в вашу систему. Возможно, они будут только просматривать некоторые данные (имена пользователей, пароли, контактную информацию и т. Д.), Возможно, они будут вводить свои собственные данные, возможно, они уничтожат всю вашу базу данных, кто знает. Вы действительно хотите рискнуть?

Так вот пример того, как вы могли бы использовать подготовленное заявление, чтобы помочь уменьшить этот риск:

$sql = "SELECT * 
    FROM ventas 
    WHERE idusuario = :userid 
     OR marca LIKE ':name' 
     OR modelo LIKE ':name' 
    "; 
$params = array(
    'userid' => $_SESSION['k_username'], 
    'name' => '%'. $name .'%' 
); 

$db = new PDO(...); // replace ... with your connection info 
$query = $db->prepare($sql); 
$query->execute($params); 
$results = $query->fetchAll(); 

Это просто пример, есть и другие способы (некоторые примеры, приведенные в ссылках выше).

+0

Я сделал это неправильно: '( –

+1

Я думаю, что это лучший ответ, потому что он предлагает использовать подготовленные заявления, вы должны попробовать их – oware

+0

hii :) Есть как-то лучше не допускать SQL-инъекции, sam demo вашей части , пожалуйста, –

0

спасибо всем извергов

это решается

$query = "SELECT * FROM `ventas` WHERE `marca` LIKE '%" . $name ."%' AND `idusuario` = 2 ORDER BY `idusuario` ASC "; 

но проблема сейчас вместо idusuario = 2 Я хочу что-то вроде

$query = "SELECT * FROM `reparaciones` WHERE `marca` LIKE '%" . $name ."%' AND `idusuario` = $_SESSION[k_username] ORDER BY `idusuario` ASC "; 

спасибо :)

0

решил yopeeee :) Спасибо огромное всем

$query = "SELECT * FROM `reparaciones` WHERE `marca` LIKE '%" . $name ."%' AND `idusuario` = '" . $_SESSION['k_username'] . "' ORDER BY `idusuario` ASC "; 
Смежные вопросы