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
Вы используете оператор добавления (+=
), когда вы должны использовать конкатенацию (.=
) operator.
Вы также должны избегать ввода, чтобы избежать инъекции SQL - см. mysql_real_escape_string()
отсутствует пробел между "и AND в добавленной строке
Ваша проблема в том, что вы не указали '
к дате рождения.
Измените его на AND threads.min_day_of_birth <= '$day_of_birth'
(обратите внимание на закрытие '
и открытие )
Кроме того, как указывали другие, вы должны написать $query .=
вместо $query +=
(note .
)
У вас есть уязвимость SQL Injection; вы должны использовать параметры.
Помните таблицы Bobby!
Вы также можете использовать заполнители в своем запросе. Если параметр/параметр установлен, 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.
. = используется для конкатенации строк в PHP, а не + =