если функция внутри SQL-запроса?

0
function get_tags_by_criteria($gender_id, $country_id, $region_id, $city_id, $day_of_birth=NULL, $tag_id=NULL, $thread_id=NULL) {

    $query = "SELECT tags.*
        FROM tags, thread_tag_map, threads
        WHERE thread_tag_map.thread_id = threads.id
        AND thread_tag_map.tag_id = tags.id

        AND threads.gender_id = $gender_id
        AND threads.country_id = $country_id
        AND threads.region_id = $region_id
        AND threads.city_id = $city_id
        AND tags.id LIKE '%$tag_id%'
        AND threads.id LIKE '%$thread_id%'";
        if(!$day_of_birth)
        {
            $query += "AND threads.min_day_of_birth <= '$day_of_birth AND threads.max_day_of_birth >= '$day_of_birth' ";
        }

        $query += "GROUP BY tags.name";

    $result = $this->do_query($query);
    return $result;
}

Если в качестве аргумента не передается $day_of_birth, я хочу, чтобы sql опускал 2 строки внутри if. Я использовал:

$all_tags = $forum_model->get_tags_by_criteria(1, 1, 0, 0);

Интересно, почему этот sql возвращает ошибку:

Couldn't execute query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0' at line 1
  • 1
    как выглядит окончательный запрос? echo $ query;
  • 0
    +1 к Галену, простое повторение запроса могло бы пролить свет на многие проблемы, на которые указывали люди, указанные ниже.
Теги:

5 ответов

2
Лучший ответ

Вы используете оператор добавления (+=), когда вы должны использовать конкатенацию (.=) operator.

Вы также должны избегать ввода, чтобы избежать инъекции SQL - см. mysql_real_escape_string()

1

отсутствует пробел между "и AND в добавленной строке

1

Ваша проблема в том, что вы не указали ' к дате рождения.

Измените его на AND threads.min_day_of_birth <= '$day_of_birth' (обратите внимание на закрытие ' и открытие )
Кроме того, как указывали другие, вы должны написать $query .= вместо $query += (note .)


У вас есть уязвимость SQL Injection; вы должны использовать параметры.
Помните таблицы Bobby!

  • 0
    LOL, этот Bobby Tables немного смешной! Спасибо за хороший смех :).
  • 0
    Бобби Столы? Что это?
Показать ещё 2 комментария
0

Вы также можете использовать заполнители в своем запросе. Если параметр/параметр установлен, script устанавливает содержимое заполнителя в соответствующий код sql, иначе placeholder пуст /null.

например.

function get_tags_by_criteria($gender_id, $country_id, $region_id, $city_id, $day_of_birth=NULL, $tag_id=NULL, $thread_id=NULL) {
  if ( !is_null($day_of_birth) ) {
    $day_of_birth = "AND ('$day_of_birth' BETWEEN threads.min_day_of_birth AND threads.max_day_of_birth)"
  }

  $query = "
    SELECT
      tags.*
    FROM
      tags, thread_tag_map, threads
    WHERE
      thread_tag_map.thread_id = threads.id
      AND thread_tag_map.tag_id = tags.id
      AND threads.gender_id = $gender_id
      AND threads.country_id = $country_id
      AND threads.region_id = $region_id
      AND threads.city_id = $city_id
      AND tags.id LIKE '%$tag_id%'
      AND threads.id LIKE '%$thread_id%'
      {$day_of_birth}
    GROUP BY
      tags.name
  ";

  $result = $this->do_query($query);
  return $result;
}

edit: как упоминалось ранее: сохраните возможную инъекцию sql.

0

. = используется для конкатенации строк в PHP, а не + =

  • 0
    также ставьте пробел перед и в операторе if

Ещё вопросы

Сообщество Overcoder
Наверх
Меню