MySQL make query включает переменную PHP, которая содержит другую переменную - PullRequest
0 голосов
/ 12 января 2012

Я пробовал несколько вещей, но я не могу заставить работать запрос MySQL в моем php-коде.Обратите внимание, что запрос работает, когда я жестко закодировал переменную $ lastmsg, которая является целым числом.

Код работает в двух случаях:

  1. Когда страница загружается, запрос выполняется, игнорируя $pagination, поскольку $lastmsg не установлено.
  2. Кнопка отправляет значение lastmsg на эту страницу, которая снова запускает код, на этот раз, глядя на $ pagination, потому что lastmsg установлен.

Опять же, запрос РАБОТАЕТ.Доказательством является то, что он отлично работает в первом случае и правильно возвращается, когда переменные жестко закодированы.Firebugs сообщает, что lastmsg отправляется по почте.

Проблема в том, что запрос не получает значение для $ lastmsg (я не получаю возвращаемых значений).Я знаю, что это потому, что $ lastmsg находится внутри $ pagination.

PS Я знаю, что нужна защита от инъекций ... Я просто пытаюсь заставить это работать:

if(isset($_POST['lastmsg']) &&is_numeric($_POST['lastmsg'])){
    $lastmsg = $_POST['lastmsg'];
    $pagination = 'AND $wpdb->posts.ID < ".$lastmsg."';
} else {
    $pagination = '';
}

$pageposts = $wpdb->get_results($wpdb->prepare("
    SELECT * FROM $wpdb->posts
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post' 
    AND $wpdb->posts.post_date < NOW()+INTERVAL 1 DAY 
    AND $wpdb->term_taxonomy.taxonomy = 'category' 
    AND $wpdb->term_taxonomy.term_id IN(3)
    ".$pagination."
    ORDER BY $wpdb->posts.post_date DESC
    LIMIT 10
    "), OBJECT); 

Следующее НЕ работает

$pagination = 'AND $wpdb->posts.ID < ';
$pageposts = $wpdb->get_results($wpdb->prepare("
    SELECT * FROM $wpdb->posts
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post' 
    AND $wpdb->posts.post_date < NOW()+INTERVAL 1 DAY 
    AND $wpdb->term_taxonomy.taxonomy = 'category' 
    AND $wpdb->term_taxonomy.term_id IN(3)
    ".$pagination."
    ".$lastmsg."
    ORDER BY $wpdb->posts.post_date DESC
    LIMIT 10
    "), OBJECT); 

Есть какие-нибудь решения?

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Парсер PHP будет игнорировать строки, заключенные в одинарные кавычки (''), как если бы они были обычными строками.Вы также можете заставить анализатор PHP анализировать строки, заключив их в двойные кавычки ("").

В вашем случае $ pagination выглядит следующим образом

$pagination = 'AND $wpdb->posts.ID < ".$lastmsg."';

Внешние кавычки - это одинарные кавычки, поэтому они будут игнорироваться PHP и $wpdb->posts.ID, и даже $ lastmsg будетсчитаются простыми строками, они не получат свои значения PHP.
просто измените вашу строку на

$pagination = "AND $wpdb->posts.ID < '$lastmsg'";

еще раз, если $ lastmsg числовой, вам не нужны внутренние кавычки

2 голосов
/ 12 января 2012

Это не та строка, которую вы ищете:

$pagination = 'AND $wpdb->posts.ID < ".$lastmsg."';

Это оставит литерал AND $wpdb->posts.ID < ".$lastmsg." внутри $pagination, и эта строка не даст ничего полезного, когда вы передадите ее в MySQL..

Вы хотите использовать двойные кавычки снаружи (для интерполяции) и не использовать одинарные кавычки:

$pagination = "AND $wpdb->posts.ID < $lastmsg";

Или, если $lastmsg - это строка, а не число:

$pagination = "AND $wpdb->posts.ID < '$lastmsg'";

Это должно заставить вашу первую версию работать.

А теперь иди и добавь все свои mysql_real_escape_string звонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...