Динамическая подстановка переменных в запрос (MySQL)

Фанат

oncle terrible
Команда форума
и ангельское терпение.
тебя спросили, как выглядит это "не работает"?
но ответа нет. кому нужно, чтобы запрос работал - непонятно. наверное - мне...

-~{}~ 30.06.09 21:17:

я бы на http://phpfaq.ru/debug сначала послал
 

berkut

Новичок
собсна варианты
Wicked
и
Alexandre
генерят совершенно разные по логике и резалту запросы.. еси чо
 

MisterBonus

Новичок
Огромное спасибо Wicked! Ты наверное хакер! :) Этот запрос именно то, что мне нужно! Всё работает так, как я хотел! Также огромное спасибо всем, кто пытался мне помочь! ОГРОМНОЕ ВСЕМ СПАСИБО!
 

Red Alert

Новичок
foreach ($_GET as $key=>$value)
{
$kod .= (!empty($value)) ? " AND ".$key ."='".$value."'" : "";
}

где $_GET ты выбери сам. И поставь дополнительные проверки. Это если название полей совпадает если нет, поставь в ф-цию.
 

Фанат

oncle terrible
Команда форума
Red Alert
спасибо за классический пример SQL инъекции
 

Rin

*
>спасибо за классический пример SQL инъекции
:) +1

>Нужно сделать поиск зарегистрированных на сайте участников по определённым критериям
>(например фамилии, имени или городу проживания), если клиентом через форму они были переданы не пустыми.

PHP:
$db = new MysqlRapid();  #see http://forum.dklab.ru/viewtopic.php?t=26693
$db->connect('mysqli://username:password@host/dbname');
$where = array();
foreach (array('name', 'city', 'lastname') as $key)
{
    if (is_string(@$_REQUEST[$key]) && strlen($_REQUEST[$key]) > 0) $where[$key] = $_REQUEST[$key]; #0 is not empty!
}
$sql = 'SELECT *
          FROM t1
         WHERE ' . $db->quoteRow($where, null, ' AND ');
$rows = $db->select($sql);
 

MisterBonus

Новичок
Выходит что пример, показанный Wicked может быть подвержен SQL инъекции?

Rin, я не спец в php (особо времени нет для изучения... т.к. работаю...), подскажи пожалуйста как мне использовать твой скрипт... переменную $rows нужно использовать как массив mysql_fetch_array? или как там?... извиняюсь за тупость...
 

MisterBonus

Новичок
Извиняюсь... перепутал... Сейчас я пользуюсь примером Wicked-а... надеюсь в его запросе нет "дыр"... а вот примером Rin-а я не знаю как пользоваться... хотя что-то в нём есть...
 

nirex

Новичок
is_string(@$_REQUEST[$key]) это што ? :))))) таг можна тольго ешо болше накасячить.

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

FractalizeR

Новичок
Я бы предложил такой вариант:
PHP:
<?
$validFields = array('fieldname1', 'fieldname2', 'fieldname3');

$sqlParts = array;
foreach($validFields as $validField) {
	if(!empty($_POST[$validField])) {
		$sqlParts[] = $validField . '="'.mysql_real_escape_string($_POST[$validField]) . '"';
	}
}
$sql = 'SELECT * FROM table WHERE' . implode(' AND ', $sqlParts);
 

Фанат

oncle terrible
Команда форума
FractalizeR
это сферический случай в вакууме.
в реальности редко форма состоит из одних тупых сравнений.
 

dr-sm

Новичок
Автор оригинала: Alexandre
схематично так:
Код:
$p1=$p2=$p3=0;
if ($name != ''  ){    
    $subSql1 = "name='$name'";
    $and1 = ' AND  ';
    $p1=1;
}
if ( $city != '' )   { 
    $subSql2 = "city='$city'";
    $and2 = ' AND  ';
    $p2=1;
}

if ( $lastname != '' )   { 
    $subSql2 = "lastname='$lastname'";
        $p3=1;
}

if (  $p2 +$p3  ==0  )
  $end1='';

if (  $p1+$p2 ==2 && $p3==0  )
    $end2='';

if ( $p1+p2+p3 )
   $sql = "SELECT * FROM tablename WHERE  $subSql1 $and1 $subSql2 $and2 $subSql3   ";
else
  $sql = "Select * FROM tablename";
:confused:
я обычно так делаю:
Код:
$sql = "Select * FROM tablename where 1";

if ($a)
  $sql += ' and a= ' . $aQuoted; 

if ($b)
  $sql += ' and b= ' . $bQuoted; 

if ($c)
  $sql += ' and c= ' . $cQuoted;
 
Сверху