Здравствуйте все! Очень нужна помощь. Кто может помогите, пожалуйста. Есть таблица вывода объектов недвижимости. Есть свободный элемент "key[]". Как сделать, чтобы можно было отмеченные объекты вывести на печать и прочее. Спасибо.
Re: отбор записей по отмеченному checkbox в PHP + MySQL
Z>Здравствуйте все! Очень нужна помощь. Кто может помогите, пожалуйста. Есть таблица вывода объектов недвижимости. Есть свободный элемент "key[]". Как сделать, чтобы можно было отмеченные объекты вывести на печать и прочее. Спасибо.
foreach($_REQUEST[key] as $value)
{
//что-то там делаем
}
Здравствуйте, 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>
По идее js собирает строку типа printlist.php?print_now=&idobj=26+OR+28+OR+30 для передачи в заголовок, чтобы отфильтровать записи. Записи выводятся, но не фильтруются. На страничке printlist.php стоит перехват:
Здравствуйте, 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 стоит перехват:
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
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
Здравствуйте, 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
Спасибо попробую. А то я столько программ перепробовала с якобы возможностью дебугить. А дебуг еще и не всегда запускается на них. А на некоторых вообще не запускается. PHPEd, например, иногда запускает. А phpDesigner нет. Правда, может я чего-то не так делаю
M>Ну, это не методом научного тыка. Генерируется же там Правда, тут надо будет код дописать, чтобы в $sFilter не попадал последний OR
А вот с этого места можно поподробнее? Ну не программер я
M>>>на клиенте ничего не надо собирать — это прямой путь к SQL Injection Z>>У меня защита стоит.
M>Какая?
Простая. Запрет на ввод любых символов кроме smallinteger в фильтр. Везде идет проверка is_numeric
Re[9]: отбор записей по отмеченному checkbox в PHP + MySQL
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
Ну, в исходном сообщении просто этого не была, а фильтра напрямую формировался на клиенте