отбор записей по отмеченному checkbox в PHP + MySQL
От: zloynik  
Дата: 28.07.08 09:52
Оценка:
Здравствуйте все! Очень нужна помощь. Кто может помогите, пожалуйста. Есть таблица вывода объектов недвижимости. Есть свободный элемент "key[]". Как сделать, чтобы можно было отмеченные объекты вывести на печать и прочее. Спасибо.
Re: отбор записей по отмеченному checkbox в PHP + MySQL
От: Mamut Швеция http://dmitriid.com
Дата: 28.07.08 11:36
Оценка:
Z>Здравствуйте все! Очень нужна помощь. Кто может помогите, пожалуйста. Есть таблица вывода объектов недвижимости. Есть свободный элемент "key[]". Как сделать, чтобы можно было отмеченные объекты вывести на печать и прочее. Спасибо.
foreach($_REQUEST[key] as $value)
{
    //что-то там делаем
}


dmitriid.comGitHubLinkedIn
Re[2]: отбор записей по отмеченному checkbox в PHP + MySQL
От: zloynik  
Дата: 28.07.08 12:31
Оценка:
Здравствуйте, Mamut, Вы писали:

Z>>Здравствуйте все! Очень нужна помощь. Кто может помогите, пожалуйста. Есть таблица вывода объектов недвижимости. Есть свободный элемент "key[]". Как сделать, чтобы можно было отмеченные объекты вывести на печать и прочее. Спасибо.

M>
M>foreach($_REQUEST[key] as $value)
M>{
M>    //что-то там делаем
M>}
M>

Немного разверну вопрос. По-моему я неправильно его задала.
<script language="JavaScript" type="text/javascript">

    
    //  Показать выделенные 
    function ShowOffers(print){
        event.returnValue=false;
        var offers = document.getElementsByName('key[]');    
        var idobj = new Array();
        for(var i=0; i<offers.length; i++){
            if ( offers[i].checked && offers[i].checked == true){
                idobj[idobj.length] = offers[i].value;
                if (print){
                    notepad_delete( new Array(offers[i].value) );
                }
            }    
        }
        if ( idobj.length < 1 ) {
            document.prev_frm.print_now.value = 0;    
            alert('Ни одно предложение не отмечено!');
            return false;
        }else{
            document.prev_frm.idobj.value = idobj.join('+OR+');    
            document.prev_frm.submit();
        }
    }    


</script>


<form name="prev_frm" target="_self" action="printlist.php">
  <input name="print_now" type="hidden" value="" />
  <input name="idobj" type="hidden" value="" />

</form>

По идее js собирает строку типа printlist.php?print_now=&idobj=26+OR+28+OR+30 для передачи в заголовок, чтобы отфильтровать записи. Записи выводятся, но не фильтруются. На страничке printlist.php стоит перехват:

if ($_GET['idobj']<>""){
$idobj=$_GET['idobj'];

$sFilter = "zag_objects.idobj = $idobj";
} else {
$sFilter = "";
}

Я думаю, здесь ошибка.
Re[3]: отбор записей по отмеченному checkbox в PHP + MySQL
От: Mamut Швеция http://dmitriid.com
Дата: 28.07.08 12:58
Оценка:
Здравствуйте, zloynik, Вы писали:

Z>Здравствуйте, Mamut, Вы писали:


Z>>>Здравствуйте все! Очень нужна помощь. Кто может помогите, пожалуйста. Есть таблица вывода объектов недвижимости. Есть свободный элемент "key[]". Как сделать, чтобы можно было отмеченные объекты вывести на печать и прочее. Спасибо.

M>>
M>>foreach($_REQUEST[key] as $value)
M>>{
M>>    //что-то там делаем
M>>}
M>>

Z>Немного разверну вопрос. По-моему я неправильно его задала.

Мде. Это называется извращение

1. Никогда. нет НИКОГДА не формируйте sql в запросе
2.

$filter = '';

foreach($_REQUEST['key'] as $objid)
{
    if(is_numeric($objid))
    {
        $filter .= "$objid OR ";
    }
}



После этого изменяем код:

<script language="JavaScript" type="text/javascript">

    
    //  Показать выделенные 
    function ShowOffers(print){

        // поскипано
        if ( idobj.length < 1 ) {
            document.prev_frm.print_now.value = 0;    
            alert('Ни одно предложение не отмечено!');
            return false;
        }else{
                        // НИКОГДА не формируйте sql запросы на клиенте
            //document.prev_frm.idobj.value = idobj.join('+OR+');    
            document.prev_frm.submit();
        }
    }    


</script>


Z>По идее js собирает строку типа printlist.php?print_now=&idobj=26+OR+28+OR+30 для передачи в заголовок, чтобы отфильтровать записи. Записи выводятся, но не фильтруются. На страничке printlist.php стоит перехват:


if ($_GET['idobj']<>""){
    $idobj=$_GET['idobj'];

    $sFilter = "zag_objects.idobj = $idobj";
} else {
    $sFilter = "";
}

Я думаю, здесь ошибка.

Там дальше формируется SQL-запрос. Ошибка, видимо, в SQL-запросе


dmitriid.comGitHubLinkedIn
Re[4]: отбор записей по отмеченному checkbox в PHP + MySQL
От: zloynik  
Дата: 28.07.08 19:10
Оценка:
Здравствуйте, Mamut, Вы писали:

M>1. Никогда. нет НИКОГДА не формируйте sql в запросе

M>2.

Не буду.

M>$filter = '';


M>foreach($_REQUEST['key'] as $objid)

M>{
M> if(is_numeric($objid))
M> {
M> $filter .= "$objid OR ";
M> }
M>}
M>[/php]

Вот над этим можно поработать. Хотя выдает ошибку Warning: Invalid argument supplied for foreach()
M>После этого изменяем код:

M>
M><script language="JavaScript" type="text/javascript">

    
M>    //  Показать выделенные 
M>    function ShowOffers(print){

M>        // поскипано
M>        if ( idobj.length < 1 ) {
M>            document.prev_frm.print_now.value = 0;    
M>            alert('Ни одно предложение не отмечено!');
M>            return false;
M>        }else{
M>                        // НИКОГДА не формируйте sql запросы на клиенте
M>            //document.prev_frm.idobj.value = idobj.join('+OR+');    
M>            document.prev_frm.submit();
M>        }
M>    }    


M></script>
M>


Не работает. НЕ реагирует на нажатие на ссылку.

M>if ($_GET['idobj']<>""){
M>    $idobj=$_GET['idobj'];

M>    $sFilter = "zag_objects.idobj = $idobj";
M>} else {
M>    $sFilter = "";
M>}
M>



M>Там дальше формируется SQL-запрос. Ошибка, видимо, в SQL-запросе


Вот так выглядит запрос в моем варианте:

Failed to execute SQL: SELECT photo.small, photo.big, photo.pos, zag_objects.idnaznacheniya, zag_objects.idnaspunkt, 
zag_objects.idrajon, zag_objects.idregion, zag_objects.idnapravleniya, zag_objects.idshosse, zag_objects.udalennost, 
zag_objects.idedismudalennosti, zag_objects.obschaya, zag_objects.idedizmploschady, zag_objects.ploschaducastka, 
zag_objects.idedizmploschady2, zag_objects.idvidasdelky, zag_objects.cena, zag_objects.idedizmceny, zag_objects.telephon1,
zag_objects.telephon2, zag_objects.fiosotrudnika, zag_objects.datavneseniya, zag_objects.mestoraspologenie, 
zag_objects.techinfo, zag_objects.terrainfo, zag_objects.prochee, zag_objects.napervuyu, zag_objects.publicate, 
zag_objects.gilaya, zag_objects.kuhnya, zag_objects.etagnost, zag_objects.idtipdoma, zag_objects.komnat, 
zag_objects.pokomnatam, zag_objects.idobj FROM photo LEFT OUTER JOIN zag_objects ON (photo.idobj = zag_objects.idobj) 
WHERE ((zag_objects.publicate = -1) AND (photo.pos = 1)) AND (zag_objects.idobj = 29 OR 34) 
AND (((zag_objects.idnaznacheniya = 55)))) GROUP BY idobj. Error: 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 ') 
GROUP BY idobj' at line 1

Базовая часть строки SQL формируется в конфигурации, а на клиенте собирается Where в зависимости от выбора клиента.
Re[5]: отбор записей по отмеченному checkbox в PHP + MySQL
От: Mamut Швеция http://dmitriid.com
Дата: 29.07.08 07:23
Оценка:
M>>
M>><script language="JavaScript" type="text/javascript">

// skip

M>></script>
M>>


Z>Не работает. НЕ реагирует на нажатие на ссылку.


На какую ссылку? Firebug в руки и проверять

Z>
M>>if ($_GET['idobj']<>""){
M>>    $idobj=$_GET['idobj'];

M>>    $sFilter = "zag_objects.idobj = $idobj";
M>>} else {
M>>    $sFilter = "";
M>>}
M>>



M>>Там дальше формируется SQL-запрос. Ошибка, видимо, в SQL-запросе


Z>Вот так выглядит запрос в моем варианте:


Z>
Z>zag_objects.pokomnatam, zag_objects.idobj FROM photo LEFT OUTER JOIN zag_objects ON (photo.idobj = zag_objects.idobj) 
Z>WHERE ((zag_objects.publicate = -1) AND (photo.pos = 1)) AND (zag_objects.idobj = 29 OR 34) 
Z>AND (((zag_objects.idnaznacheniya = 55)))) GROUP BY idobj. Error: You have an error in your SQL syntax; 
Z>check the manual that corresponds to your MySQL server version for the right syntax to use near ') 
Z>GROUP BY idobj' at line 1
Z>


Выделенное меняем на

zag_objects.idobj = 29 OR zag_objects.idobj = 34



Z>Базовая часть строки SQL формируется в конфигурации, а на клиенте собирается Where в зависимости от выбора клиента.


на клиенте ничего не надо собирать — это прямой путь к SQL Injection


dmitriid.comGitHubLinkedIn
Re[6]: отбор записей по отмеченному checkbox в PHP + MySQL
От: zloynik  
Дата: 29.07.08 12:28
Оценка:
Здравствуйте, Mamut, Вы писали:

M>На какую ссылку? Firebug в руки и проверять


А где взять ентого зверя?

Z>>
Z>>zag_objects.pokomnatam, zag_objects.idobj FROM photo LEFT OUTER JOIN zag_objects ON (photo.idobj = zag_objects.idobj) 
Z>>WHERE ((zag_objects.publicate = -1) AND (photo.pos = 1)) AND (zag_objects.idobj = 29 OR 34) 
Z>>AND (((zag_objects.idnaznacheniya = 55)))) GROUP BY idobj. Error: You have an error in your SQL syntax; 
Z>>check the manual that corresponds to your MySQL server version for the right syntax to use near ') 
Z>>GROUP BY idobj' at line 1
Z>>


M>Выделенное меняем на


M>
M>zag_objects.idobj = 29 OR zag_objects.idobj = 34
M>


Тогда, методом научного тыка (пальцем в небо...) меняем здесь:

if ($_GET['idobj']<>""){
foreach($_REQUEST['idobj'] as $objid)
{
  if(is_numeric($objid))
       $sFilter = "zag_objects.idobj = $idobj OR ";
} else {
$sFilter = "";


M>на клиенте ничего не надо собирать — это прямой путь к SQL Injection


У меня защита стоит.
Re[7]: отбор записей по отмеченному checkbox в PHP + MySQL
От: Mamut Швеция http://dmitriid.com
Дата: 29.07.08 20:17
Оценка: :)
M>>На какую ссылку? Firebug в руки и проверять
Z>А где взять ентого зверя?

http://getfirebug.com/



M>>Выделенное меняем на


M>>
M>>zag_objects.idobj = 29 OR zag_objects.idobj = 34
M>>


Z>Тогда, методом научного тыка (пальцем в небо...) меняем здесь:


Z>
Z>if ($_GET['idobj']<>""){
Z>foreach($_REQUEST['idobj'] as $objid)
Z>{
Z>  if(is_numeric($objid))
Z>       $sFilter = "zag_objects.idobj = $idobj OR ";
Z>} else {
Z>$sFilter = "";
Z>



Ну, это не методом научного тыка. Генерируется же там Правда, тут надо будет код дописать, чтобы в $sFilter не попадал последний OR


M>>на клиенте ничего не надо собирать — это прямой путь к SQL Injection

Z>У меня защита стоит.

Какая?


dmitriid.comGitHubLinkedIn
Re[8]: отбор записей по отмеченному checkbox в PHP + MySQL
От: zloynik  
Дата: 30.07.08 08:09
Оценка:
Здравствуйте, Mamut, Вы писали:

M>http://getfirebug.com/


Спасибо попробую. А то я столько программ перепробовала с якобы возможностью дебугить. А дебуг еще и не всегда запускается на них. А на некоторых вообще не запускается. PHPEd, например, иногда запускает. А phpDesigner нет. Правда, может я чего-то не так делаю

M>Ну, это не методом научного тыка. Генерируется же там Правда, тут надо будет код дописать, чтобы в $sFilter не попадал последний OR


А вот с этого места можно поподробнее? Ну не программер я

M>>>на клиенте ничего не надо собирать — это прямой путь к SQL Injection

Z>>У меня защита стоит.

M>Какая?


Простая. Запрет на ввод любых символов кроме smallinteger в фильтр. Везде идет проверка is_numeric
Re[9]: отбор записей по отмеченному checkbox в PHP + MySQL
От: Mamut Швеция http://dmitriid.com
Дата: 30.07.08 13:57
Оценка:
M>>http://getfirebug.com/

Z>Спасибо попробую. А то я столько программ перепробовала с якобы возможностью дебугить. А дебуг еще и не всегда запускается на них. А на некоторых вообще не запускается. PHPEd, например, иногда запускает. А phpDesigner нет. Правда, может я чего-то не так делаю


Firebug позволяет дебагить Javascript на клиенте, а не РНР. Но инструент мега полезные

M>>Ну, это не методом научного тыка. Генерируется же там Правда, тут надо будет код дописать, чтобы в $sFilter не попадал последний OR


Z>А вот с этого места можно поподробнее? Ну не программер я


У нас идет склейка нескольких значений в цикле в стиле
фильтр = фильтр + новое значение + OR


Естетсвенно, что в конце получится, что фильтр выглядит как-то так:
val1 OR val2 OR val3 OR


Потому можно сделать так:
$sFilter=''; // if-else нам не нужно. достаточно просто if'а

if (isset($_GET['idobj'])) // можно добавить && is_array($_GET['idobj']), если паранойя
{
    foreach($_REQUEST['idobj'] as $objid)
    {
        if(is_numeric($objid))
            $sFilter .= "zag_objects.idobj = $idobj OR ";
    }
}

$sFilter .= ' zag_objects.idobj = 0';


Таким образом фильтр будет выглядеть в стиле:
zag_objects.idobj = 1 OR
zag_objects.idobj = 2 OR
zag_objects.idobj = 3 OR
zag_objects.idobj = 0


так как обычно ID не равно нулю то нестрашно

M>>>>на клиенте ничего не надо собирать — это прямой путь к SQL Injection

Z>>>У меня защита стоит.

M>>Какая?


Z>Простая. Запрет на ввод любых символов кроме smallinteger в фильтр. Везде идет проверка is_numeric


Ну, в исходном сообщении просто этого не была, а фильтра напрямую формировался на клиенте


dmitriid.comGitHubLinkedIn
Re[10]: отбор записей по отмеченному checkbox в PHP + MySQL
От: zloynik  
Дата: 02.08.08 13:36
Оценка:
Здравствуйте, Mamut, Вы писали:


M>if (isset($_GET['idobj'])) // можно добавить && is_array($_GET['idobj']), если паранойя

M>{
M> foreach($_REQUEST['idobj'] as $objid)
M> {
M> if(is_numeric($objid))
M> $sFilter .= "zag_objects.idobj = $idobj OR ";
M> }
M>}

M>$sFilter .= ' zag_objects.idobj = 0';

M>[/php]

Invalid argument supplied for foreach()
Re[11]: отбор записей по отмеченному checkbox в PHP + MySQL
От: Аноним  
Дата: 13.08.08 11:04
Оценка:
Z>Здравствуйте, Mamut, Вы писали:


M>>if (isset($_GET['idobj'])) // можно добавить && is_array($_GET['idobj']), если паранойя

M>>{
M>> foreach($_REQUEST['idobj'] as $objid)
M>> {
M>> if(is_numeric($objid))
M>> $sFilter .= "zag_objects.idobj = $idobj OR ";
M>> }
M>>}

M>>$sFilter .= ' zag_objects.idobj = 0';

M>>[/php]

Z>Invalid argument supplied for foreach()


Может все-таки кто-нибудь поможет?
Re[12]: отбор записей по отмеченному checkbox в PHP + MySQL
От: Mamut Швеция http://dmitriid.com
Дата: 13.08.08 11:33
Оценка:
Z>>Invalid argument supplied for foreach()

А>Может все-таки кто-нибудь поможет?


var_dump($_GET);

помотреть, что передается, и действовать согласно обстоятеьствам


dmitriid.comGitHubLinkedIn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.