PHP убирает часть строки - PullRequest
2 голосов
/ 11 января 2011

Я пытаюсь создать простое выражение SQL:

    // 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()

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

Что здесь?

Ответы [ 4 ]

1 голос
/ 11 января 2011

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

0 голосов
/ 17 марта 2011

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

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

Если вы наведите курсор на переменную во время отладки в Zend Studio, появится маленькое окно, в котором будет показано содержимое этой переменной (иногда). Это окно отключает все, что следует за «

К сожалению, это все еще лучшая среда разработки, которую я когда-либо придумывал для PHP.

0 голосов
/ 11 января 2011

Почему бы не использовать оператор МЕЖДУ ?

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

РЕДАКТИРОВАТЬ:

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

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

до:

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

Или в обратном порядке: введите = first

$sql .= 'AND fromdate =< expirydate ';
$sql .= 'ORDER BY rand()';
0 голосов
/ 11 января 2011

Я не уверен, что является причиной проблемы. Видимо, есть что-то, что лишает 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 между fromdate и curdate () И expirydate не меньше, чем любой из них. Это означает, что значение expirydate должно быть больше, чем fromdate, curdate для оператора, возвращающего true, чего вы и пытаетесь достичь.

...