2013-12-18 3 views
1

У меня возникли проблемы с преобразованием моего кода из sql в mysqli. $ XX может быть 1 или 0. Когда $ XX = 1, я хочу его найти. Когда $ XX = 0, не должно быть поиска $ XX. То же самое для $ YY.Преобразование sql в mysqli_prepare с переменными переменными

Старый код

$sql = "SELECT name FROM tabel WHERE 1=1";  
if (!empty($XX)) {$sql .= " AND XX = 1 ";}  
if (!empty($YY)) {$sql .= " AND YY = 1 ";}  

Когда $ XX = 1 и $ YY = 1, то код будет выглядеть следующим образом:

$sql = "SELECT name FROM tabel WHERE 1=1 AND XX = 1 AND YY = 1"; 

When $ XX = 0 и $ YY = 1, код будет выглядеть так:

$sql = "SELECT name FROM tabel WHERE 1=1 AND YY = 1"; 

Когда $ XX = 0 и $ YY = 0, то код будет выглядеть так:

$sql = "SELECT name FROM tabel WHERE 1=1"; 

«Проблема» в том, что я не хочу искать XX = 0, потому что это исключает все ответы XX = 1. Когда XX = 0, он не должен искать XX.

Новый код

$stmt = mysqli_prepare($link, "SELECT name FROM tabel WHERE XX=? and YY=?");  
mysqli_stmt_bind_param($stmt, "ii", $XX, $YY);   

Кто знает, как код MySQLi должен выглядеть? Благодаря!

+1

является xx или yy пользовательский ввод? – Ali

+0

@Chosen Wann Да, как $ XX, так и $ YY - пользовательский ввод. – Helena

+0

Преобразуйте свой код в PDO, и у вас будет гораздо меньше проблем. –

ответ

-1

Вы можете переписать запрос следующим образом

SELECT * FROM table1 WHERE (xx = ? OR ? = 0) AND (yy = ? OR ? = 0) 

Вот SQLFiddle демо

$sql = "SELECT * FROM table1 WHERE (xx = ? OR ? = 0) AND (yy = ? OR ? = 0)"; 
$db = new mysqli(...); 
$stmt = $db->prepare($sql)) { 
$stmt->bind_param('iiii', $xx, $xx, $yy, $yy); 
$stmt->execute(); 
$stmt->bind_result(...); 
+0

выполнимый, но, честно говоря, он грязный. –

+1

прислуга, это быстрое мышление! Спасибо. – Helena

+1

Большое вам спасибо, это работает, это спасает меня! – Helena

0

EDIT

Хорошо, от того, что я получаю сейчас, это должно быть просто. Если единственное возможное значение для XX и YY в запросе равно 1, вам не требуется bind_param.

$qry = 'SELECT name FROM table WHERE 1=1'; 
$qry .= (!empty($XX)) ? ' AND XX=1'; 
$qry .= (!empty($YY)) ? ' AND YY=1'; 

$stmt = mysqli_prepare($link, $qry); 

А затем просто выполните ваш запрос.

+0

Я объясню более подробно и отредактирую вопрос выше. – Helena

+0

Вам действительно нужно переписать mysql на mysqli хотя бы один раз, прежде чем пытаться ответить на такой переход –

+0

Я не получаю это. Объяснить? –

-1

другой альтернативный, если вы можете передать имя поля в качестве параметра

$stmt = mysqli_prepare($link, "SELECT name FROM tabel WHERE XX=? and YY=?");  
mysqli_stmt_bind_param($stmt, "ii", $XX, $YY); 

, если вы хотите избежать фильтрации XX передайте $ XX как «XX» (например, имя поля) insted из 0

-1

В таком случае, когда никакая переменная не попадает в запрос, вы можете придерживаться своей текущей настройки. Просто измените команду подготовки и привязки к mysqli_query().

Однако, в случае, если вам нужно добавить переменную в запросе, вы либо можете использовать грязный раствор peterm или создать условный запрос с заполнителями, а затем вызвать bind_param() с переменным числом параметров call_user_func_array()

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