2011-01-11 1 views
2

Я пытаюсь построить простой оператор SQL:PHP зачистки часть строки

// build sql statement   
    $sql = "select * from some_tbl where "; 
    if(strlen($mydetails['city']) > 0) { 
     $sql .= "cityname in (".$mydetails['city'].") and "; 
    } 
    $sql .= 'fromdate <= expirydate and expirydate >= curdate() order by rand()'; 

Но $ SQL отсутствует все между < и>. Отладчик показывает значение $ sql как:

select * from tbl_adsinfo where fromdate = curdate() order by rand() 

Это настолько просто, что я просто потерялся. Я не думаю, что < или> являются специальными символами? Я попытался ускользнуть от них и вместо этого использовать двойные кавычки, и это одно и то же.

Что здесь?

+0

Вы делаете это через какой-то веб-редактор? Может быть, что-то убирает то, что выглядит недействительным тегом HTML. Попробуйте изменить порядок (так что это '> ... <' вместо) или, возможно, заменив их '' </> 'сущностями и посмотрим, поможет ли это. –

+1

повторите переменную $ mydetails ['city']. я ставлю, что по какой-то причине он пуст. – dqhendricks

+0

Можете ли вы предоставить весь код между вашими строками $ sql, когда вы действительно запрашиваете БД? Вы вызываете 'strip_tags' в свой sql-оператор? – jasonbar

ответ

0

Хорошо, я понял. Проблема не имела ничего общего с PHP, это была Zend Studio и/или XDebugger.

Получение Zend для использования отладчика вообще заняло у меня много дней, и я уверен, что это, вероятно, не совсем кошерно, как я его запускал.

Если вы наведете над переменной во время отладки в Zend Studio, появится небольшое окно, чтобы показать вам содержимое этой переменной (иногда). Это окно отключает все, что следует за «<». Переменная по-прежнему содержит правильную строку, но IDE/Debugger довольно вводит в заблуждение. К сожалению, поскольку этот конкретный символ является общей проблемой из-за разбора html, это было довольно запутанной ошибкой для идентификации.Проблема усугубляется, если вы пытаетесь сравнить результат с php-страницы или если вы смотрите на очень длинный вывод (для очень длинных строк кажется, что вы можете видеть только 1024 символа в окне переменной отладки, чтобы строка могла казаться усеченной).

К сожалению, это по-прежнему лучшая IDE, к которой я придумал PHP.

0

Я не уверен, что вызывает проблему. По-видимому, есть что-то, что может скрыть html-теги как нечто вроде безопасности. Одно из предложений заключается в попытке заменить «<» и «>» с их ASCII-коды:

$sql .= 'fromdate '.chr(60).'= expirydate and expirydate '.chr(62).'= curdate() order by rand()'; 

редактировать: Вы также можете использовать NOT BETWEEN заявление, как показано ниже:

$sql .= '(expirydate NOT BETWEEN fromdate AND curdate()) AND (expirydate NOT BETWEEN fromdate AND 17530101) ORDER BY rand() 

17530101 является означало наименьшее значение для возможного времени. В предыдущем коде вы проверяете, нет ли expirydate между датой и curdate() И expirydate не меньше, чем любой из них. Это означает, что expirydate должен быть больше, чем fromdate, curdate для утверждения, чтобы вернуть true, чего вы пытаетесь достичь.

0

Почему бы не использовать BETWEEN?

$sql .= 'expirydate BETWEEN fromdate AND curdate() ORDER BY rand()'; 

EDIT:

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

$sql .= 'fromdate <= expirydate and expirydate >= curdate() order by rand()'; 

к:

$sql .= 'expirydate >= curdate() '; 
$sql .= 'AND fromdate <= expirydate '; 
$sql .= 'ORDER BY rand()'; 

Или в обратном порядке из оператор: сделать = первый

$sql .= 'AND fromdate =< expirydate '; 
$sql .= 'ORDER BY rand()'; 
+0

BETWEEN испортил логику кода. expirydate не должно быть между датой и curdata(). expirydate на самом деле проверяется как больше, чем fromdata и curdata(). Это может быть сделано с NOT BETWEEN: expirydate NOT BETWEEN fromdate AND curdate() И expirydate NOT BETWEEN fromdate И {основывать (возможно 0)} ORDER BY rand() – deadlock

+0

Хорошая идея. К сожалению, добавление этих строк также не помогает. Этот var заканчивается «select * from tbl_adsinfo, где expirydate> = curdate() AND fromdate <» - все после того, как знак lessthan отключен. – doub1ejack

+0

обновленный ответ, будет ли это работать? –

1

Вы бы не запускали переменную $ sql через функцию striptags(), не так ли? Это было бы согласуется с тем, что он удаляет «< = expirydate и expirydate>», поскольку он предположил бы, что это HTML-тег.