2013-09-17 2 views
1

У меня возникла простая проблема с запросом, сравнивающим дату в таблице с датой ввода от пользователя. (дайте мне список всех людей в таблице с датой рождения «MM/DD/YYYY»).

При вводе нового человека в db я хочу проверить, что это лицо еще не находится в db. Поэтому, используя «firstname» «lastname» и «date of birth», запрашивается таблица, и если есть совпадение, появляется окно и говорит: «Вы уверены, что хотите сделать это, похоже, что человек уже введен».

НЕТ ПРОБЛЕМЫ с «первым именем» «фамилия» (у меня это хорошо работает), поэтому теперь я хочу добавить «дату рождения» в запрос. В начале я удалил «firstname» и «lastname» и использовал только «дату рождения».

Как «доказательство концепции» следующий запрос MySQL отлично работает на Workbench MySQL:

SET @testdate = "1934-06-06"; 
SELECT localid, firstname, lastname, dob FROM administrative WHERE dob = @testdate; 

Столбец «д.р.» в таблице формат «дата» не «DateTime».

Так что я теперь переключиться на PHP и записать это как тест:

$frontenddob = "06/06/1934"; 
$dob = date("Y-m-d", strtotime($frontenddob)); 

echo "--$frontenddob--<br>"; //gives 06/06/1934 
echo "--$dob--<br><br>";  //gives --1934-06-06-- ("--" added to "see" extra spaces) 
echo "$dob"; echo "<br>"; //gives 1934-06-06 

$host = "xx"; 
$user = "xx"; 
$password = "xx"; 
$dbname = "xx"; 

$cxn = mysqli_connect($host,$user,$password,$dbname); 
if (mysqli_connect_errno()) {echo "No connection" . mysqli_connect_error();} 

$query = " SELECT * FROM administrative WHERE dob = $dob ORDER BY lastname ASC "; 

Типы пользователей в строку даты в формате мм/дд/гггг.

Он преобразуется в формат даты по дате («Y-m-d», strtotime ($ frontenddob)) ;.

«Echos» показывает, что правильное преобразование - «echo $ dob» дает мне 1934-06-06.

Запроса отлично работает с < =,> =, <,> и я все испробовал =, ==, ===,> = $ Даты и < = $ даты и плот других - все безуспешно.

  1. Формат в таблице для dob (дата рождения) - это «дата», а не «дата-время».
  2. Формат даты ввода ввода пользователя преобразуется в формат даты в формате YYYY-MM-DD.
  3. Запрос работает с <,>, < =,> =.

Куда я иду не так?

Благодарю вас заранее.

+0

Вы никогда не упоминаете, если он не дает записи или дает ошибку, но в качестве ответа @ nil'z вы пропустите одиночную кавычку около $ dob. –

+0

Используйте 'var_dump' для отладки переменных и т. Д. Вместо' echo '- $ dob--

"; // дает --1934-06-06-- ("-" добавлен в "see" дополнительные пробелы) '... –

+0

@Sumit Gupta - Спасибо за ваш ответ! Я преобразовываю массив в json и эхо json - все, что я получил, было «[]». Проблема решена путем добавления одинарных кавычек, как было отмечено вами, и предложенной Нильзом. Еще раз спасибо! – TimSPQR

ответ

5

Try:

$query = " SELECT * FROM administrative WHERE dob = '$dob' ORDER BY lastname ASC "; 
                ^^

Обратите внимание на одинарные кавычки вокруг $dob.

+0

Это сработало для вас? –

+0

Да, да и да !!! Огромное спасибо!!! Теперь он отлично работает. Но я предполагаю, что мне придется потратить некоторое время, глядя на требования к одиночной кавычке. У меня довольно много запросов с php-переменными $ xxxx, которые отлично работают без кавычек. Единственные одинарные кавычки, которые я использовал вокруг переменной сравнения, - LIKE '% xx%'. Очевидно, мне нужно изучить это немного больше. Печально то, что я помещал двойные кавычки вокруг него, прежде чем я разместил это, и это тоже не сработало. Итак, я благодарю вас ОЧЕНЬ ОЧЕНЬ много за ваш ответ и прозрение. – TimSPQR

+0

Happie, чтобы помочь приятелю: D –

-2

за исключением использования кавычек, старайтесь избегать strtotime в BIRTHDAY, потому что он генерирует временную метку (IT STARTS FROM YEAR 1970). попробуйте использовать взорваться(), например

$frontenddob = "12/06/1934"; 
list ($m,$d,$y) = explode('/', $frontenddob); 
$dob = sprintf("%04d-%02d-%02d", $y, $m, $d); 
+0

Очень приятно. Я видел «взрываться» раньше, но никогда не использовал его. Сегодня я поиграю с этим. Большое спасибо за ваш комментарий! – TimSPQR

+0

те, кто минусы, вероятно, не знают, что временная метка начинается с 1970 года –

+0

'Попробуйте избежать strtotime()' - почему? 'потому что он генерирует временную метку' - ну, вот что делает функция. –

0

Я играл немного с концепцией StrToTime против взрываются и узнал в другом потоке, что StrToTime хорошо вплоть до 12/13/1901. Поэтому, чтобы помочь другим нообам, таким как я, основываясь на предложениях Александра, я написал несколько строк, демонстрирующих различия между ними. Интересно поставить в 1901-12-13 и 1901-12-14 I первую строку PHP-кода. Еще раз спасибо всем!

<?php $dob = "1901-12-14"; ?> 
<html> 
<head> 
<style> 

.inputdiv { 
    width:200px; 
    margin:100px auto 10px auto; 
    background-color:#CCC2FC; 
    text-align:center; 
    border:1px solid transparent;} 

.spacer{ 
    width:199px; 
    margin:20px auto 20px auto;}  

</style> 
</head> 
<body> 

<div class="inputdiv"> 
    <div class="spacer"><?php echo "Raw dob: ".$dob ?></div> 
    <div class="spacer"><?php echo "Strtotime dob: ".date("m-d-Y", strtotime($dob)) ?></div> 
    <div class="spacer"><?php list ($y, $m, $d) = explode('-', $dob); 
         $dob = sprintf("%02d-%02d-%04d", $m, $d, $y); 
         echo "Explode dob: ".$dob ?></div> 
</div> 
</body> 
</html>