2014-01-13 5 views
0

Мне нужно выбрать строки из моей базы данных, используя несколько условий.PHP MySQL select with multiple conditions

Теперь я много раз искал, но не смог найти примеров, похожих на мои.

Пожалуйста, не рой меня, как акулы о SQL-инъекциях и т. Д., Так как я нахожусь на моей второй неделе обучения PHP, и то, что я делаю, будет использоваться только внутри.

Форма:

<form action="<?php echo $_server['php_self']; ?>" method="post"> 
    Display results from <input name="from_date" class="src_drop" type="textarea" id="from_date"> 
    to <input name="to_date" class="src_date" type="textarea" id="to_date"> 
    for <select class="src_drop" name="uniqueid" type="text"> 

    <?php 
     $sql = "select * from table_staff"; 
     $staff = mysqli_query($connection, $sql); 
     while($stafflist = mysqli_fetch_array($staff)) 
     { 
      echo '<option value="' . $stafflist['uniqueid'] . '">' . $stafflist['first_name'] . " " . $stafflist['surname'] . '</option>'; 
     } 
    ?> 
    </select> 
    <input type="submit" name="submit" class="search" value=""> 
</form> 

Оператор SELECT:

$startDate = date("Y-m-d", strtotime($_POST['from_date'])); 
$endDate = date("Y-m-d", strtotime($_POST['to_date'])); 
$uniqueid = $_POST['uniqueid']; 

$shiftdata = mysqli_query($connection, "SELECT * FROM table_shift 
    INNER JOIN table_staff ON table_shift.uniqueid = table_staff.uniqueid 
     WHERE shift_date BETWEEN '".$startDate."' AND '".$endDate." 
      AND table_shift.uniqueid='".$uniqueid."'' 
     ORDER by shift_date ASC"); 

Я пытаюсь отобразить все изменения для конкретного сотрудника между определенными датами. Код отлично подходит для выбора сдвигов между датами, но разрывает соединение при добавлении select на uniqueid. Я пробовал пару различных (догадок) вариантов синтаксиса, например. И WHERE table_shift.unqiueid ... без везения.

Ошибка:

У Вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать около «15» «ORDER по shift_date ASC» в строке 1

+0

является уникальным числом идентификатора? – DevelopmentIsMyPassion

+0

У вас есть сообщение об ошибке или ваша запись просто не выбрана? – MSadura

+0

Добавьте 'или die (mysqli_error ($ connection)' после вашего оператора mysqli_query и проверьте его. – Rikesh

ответ

1

Попробуйте это .. (и я согласен с другими об обеспечении безопасности данных приготовленных ЗАЯВЛЕНИЙ)

$startDate = date("Y-m-d", strtotime($_POST['from_date'])); 
$endDate = date("Y-m-d", strtotime($_POST['to_date'])); 
$uniqueid = $_POST['uniqueid']; 
$query = " 
SELECT * 
    FROM table_shift x 
    JOIN table_staff y 
    ON x.uniqueid = y.uniqueid 
WHERE x.shift_date BETWEEN '$startDate' AND '$endDate' 
    AND x.uniqueid = $uniqueid 
ORDER 
    BY x.shift_date ASC; 
"; 

echo $query; 
$shiftdata = mysqli_query($connection, $query) or die(mysqli_error($connection)); 
+0

Ваш код отлично работает, я не знал, что могу использовать такой синтаксис. Это также пример более безопасного кода? (является ли запрос $ подготовленным оператором?) –

+0

Нет. Но подготовленные утверждения широко обсуждаются в другом месте, и доступны как объектно-ориентированные, так и процедурные версии. Есть некоторые предположения, что процедура немного менее безопасна, но я не понимаю, почему :-( – Strawberry

1

Вы пробовали удаления одинарные кавычки

..AND table_shift.uniqueid='".$uniqueid."''

так что он выглядит как

..AND table_shift.uniqueid=".$uniqueid."

Это предполагает, что ваше UniqueID поле представляет собой целое число, а не строка.

+0

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