Приветствую! Навертел от души прекрасно работающую конструкцию - получение данных из чекбоксовой формы, формирование запроса в базу, параллельная отправка менеджеру письма с данными, что вводил и отмечал пользователь. Доволен был как слон, пока не отметил больше одного чекбокса каждого типа. И вот тут грянул вселенский пук - вывод результатов отлично работает, а вот в письме вместо всех отмеченных юзеров значений одного типа - пусто. То бишь выбирает он два чекбокса type - в письме напротив графы "тип" - пусто. По одному - все отлично. Но нужно ровно столько прислать в письме, сколько отмечено юзером. Вот и не могу никак объединить значения и через запятую их в письме написать. Прошу помощи! Код (PHP): if(isset($_REQUEST['submit'])) { $connect = connectDB(); if( count($_GET['type']) > 0 ) {$type = implode(',',$_GET['type']); $str.= ' AND type IN('.$type.')';} if( count($_GET['place']) > 0 ) {$place = implode(',',$_GET['place']); $str.= ' AND place IN('.$place.')';} if( count($_GET['rating']) > 0 ) {$rating = implode(',',$_GET['rating']); $str.= ' AND rating IN('.$rating.')';} if( $_GET['clientname'] != null ) {$cname = $_GET['clientname'];} if( $_GET['clientemail'] != null ) {$cmail = $_GET['clientemail'];} if( $_GET['clienttelephone'] != null ) {$ctel = $_GET['clienttelephone'];} $typ['25,26'] = 'ОТЕЛЬ'; $typ[28] = 'САНАТОРИЙ'; $typ[27] = 'ПАНСИОНАТ'; $ratt[15] = '1*'; $ratt[17] = '2*'; $ratt[19] = '3*'; $ratt[21] = '4*'; $ratt[23] = '5*'; $pla[5] = 'ЦЕНТР'; $pla[6] = 'ХОСТА'; $pla[7] = 'АДЛЕР'; $pla[42] = 'ИМЕРЕТИНКА'; $pla[8] = 'КРАСНАЯ ПОЛЯНА'; $pla[9] = 'ЛАЗАРЕВСКОЕ'; $pla[10] = 'ДАГОМЫС'; if($_GET and $_GET['clientemail'] != null){ if(filter_var($_GET['clientemail'], FILTER_VALIDATE_EMAIL)){ require_once($_SERVER['DOCUMENT_ROOT'].'/test/lib/MailClass.inc'); $mailer = new FreakMailer(); $mailer->Subject = 'Клиент просит связаться по поводу размещения'; $mailer->Body = 'Имя клиента: '.$cname.' email: '.$cmail.' телефон: '.$ctel.' Параметры его поиска: Тип: '.$typ[$rating].' Класс: '.$ratt[$rating].' Расположение: '.$pla[$place].''; $mailer->AddAddress('мыло@gmail.com', 'alex'); if(!$mailer->Send()) { } else { echo '<div style="display: none;"> <div class="box-modal" id="exampleModal"> <div class="box-modal_close arcticmodal-close">закрыть</div> СПАСИБО ЗА ВАШУ ЗАЯВКУ, МЫ ОБЯЗАТЕЛЬНО СВЯЖЕМСЯ С ВАМИ В БЛИЖАЙШЕЕ ВРЕМЯ </div> </div>'; } $mailer->ClearAddresses(); $mailer->ClearAttachments(); } else{ echo '<div style="display: none;"> <div class="box-modal" id="exampleModal"> <div class="box-modal_close arcticmodal-close">ЗАКРЫТЬ</div> ВЫ НЕВЕРНО ВВЕЛИ АДРЕС СВОЕЙ ЭЛЕКТРОННОЙ ПОЧТЫ.<br>ВЫ МОЖЕТЕ ПРОДОЛЖИТЬ РАБОТАТЬ С ПОИСКОМ, НО ЕСЛИ ХОТИТЕ, ЧТОБЫ МЫ С ВАМИ СВЯЗАЛИСЬ - ВВЕДИТЕ СВОЙ ЭЛЕКТРОННЫЙ АДРЕС ПРАВИЛЬНО.<br>СПАСИБО! </div> </div>'; } }
Re: Тупик - вывод нескольких значений из ассоциативного масс http://phpfaq.ru/debug а где входящие данные, выходящие как пример? Способы ввода и вывода? Сделай удобный скрипт с данными в array чтобы кто-то смог помочь.
Re: Тупик - вывод нескольких значений из ассоциативного масс Вот весь код модуля. Ниже его - данные об ошибках, что он вываливает. Код (Text): <? if( ! defined( 'DATALIFEENGINE' ) ) { die( "Hacking attempt!" ); } $tpl->load_template( 'hotels.tpl' ); ini_set('display_errors',1); error_reporting(E_ALL); function connectDB (){ define('DB_HOST', ''); define('DB_USER', ''); define('DB_PASS', ''); define('DB_NAME', ''); $dbconn = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die("Ошибка соединения с базой данных! " . mysql_error()); mysql_select_db(DB_NAME); mysql_query('SET NAMES utf8'); return $dbconn; } $site['from_name'] = 'Технический отдел'; // from (от) имя $site['from_email'] = 'it@mail'; $site['smtp_mode'] = 'disabled'; $site['smtp_host'] = null; $site['smtp_port'] = null; $site['smtp_username'] = null; if(isset($_REQUEST['submit'])) { $connect = connectDB(); if( count($_GET['type']) > 0 ) {$type = implode(',',$_GET['type']); $str.= ' AND type IN('.$type.')';} if( count($_GET['place']) > 0 ) {$place = implode(',',$_GET['place']); $str.= ' AND place IN('.$place.')';} if( count($_GET['rating']) > 0 ) {$rating = implode(',',$_GET['rating']); $str.= ' AND rating IN('.$rating.')';} if( $_GET['clientname'] != null ) {$cname = $_GET['clientname'];} if( $_GET['clientemail'] != null ) {$cmail = $_GET['clientemail'];} if( $_GET['clienttelephone'] != null ) {$ctel = $_GET['clienttelephone'];} $typ['25,26'] = 'ОТЕЛЬ'; $typ[28] = 'САНАТОРИЙ'; $typ[27] = 'ПАНСИОНАТ'; $rat[15] = '<img src="/templates/img/s1.png" border="0">'; $rat[17] = '<img src="/templates/img/s2.png" border="0">'; $rat[19] = '<img src="/templates/img/s3.png" border="0">'; $rat[21] = '<img src="/templates/img/s4.png" border="0">'; $rat[23] = '<img src="/templates/img/s5.png" border="0">'; $ratt[15] = '1*'; $ratt[17] = '2*'; $ratt[19] = '3*'; $ratt[21] = '4*'; $ratt[23] = '5*'; $pla[5] = 'ЦЕНТР'; $pla[6] = 'ХОСТА'; $pla[7] = 'АДЛЕР'; $pla[42] = 'ИМЕРЕТИНКА'; $pla[8] = 'КРАСНАЯ ПОЛЯНА'; $pla[9] = 'ЛАЗАРЕВСКОЕ'; $pla[10] = 'ДАГОМЫС'; if($_GET and $_GET['clientemail'] != null){ if(filter_var($_GET['clientemail'], FILTER_VALIDATE_EMAIL)){ require_once($_SERVER['DOCUMENT_ROOT'].'/test/lib/MailClass.inc'); $mailer = new FreakMailer(); $mailer->Subject = 'Клиент просит связаться по поводу размещения'; $mailer->Body = 'Имя клиента: '.$cname.' email: '.$cmail.' телефон: '.$ctel.' Параметры его поиска: Тип: '.$typ[$rating].' Класс: '.$ratt[$rating].' Расположение: '.$pla[$place].''; $mailer->AddAddress('@gmail', ''); if(!$mailer->Send()) { //echo 'Не могу отослать письмо!'; } else { echo '<div style="display: none;"> <div class="box-modal" id="exampleModal"> <div class="box-modal_close arcticmodal-close">закрыть</div> СПАСИБО ЗА ВАШУ ЗАЯВКУ, МЫ ОБЯЗАТЕЛЬНО СВЯЖЕМСЯ С ВАМИ В БЛИЖАЙШЕЕ ВРЕМЯ! </div> </div>'; } $mailer->ClearAddresses(); $mailer->ClearAttachments(); } else{ echo '<div style="display: none;"> <div class="box-modal" id="exampleModal"> <div class="box-modal_close arcticmodal-close">ЗАКРЫТЬ</div> ВЫ НЕВЕРНО ВВЕЛИ АДРЕС СВОЕЙ ЭЛЕКТРОННОЙ ПОЧТЫ.<br>ВЫ МОЖЕТЕ ПРОДОЛЖИТЬ РАБОТАТЬ С ПОИСКОМ ПО ОТЕЛЯМ, НО ЕСЛИ ХОТИТЕ, ЧТОБЫ МЫ С ВАМИ СВЯЗАЛИСЬ - ВВЕДИТЕ СВОЙ ЭЛЕКТРОННЫЙ АДРЕС ПРАВИЛЬНО.<br>СПАСИБО! </div> </div>'; } } function resSQL($s){ $r=mysql_query($s); if ($row=mysql_fetch_row($r)) return $row[0]; else return false; } $mpp=9; if (empty($_GET['page']) || ($_GET['page'] <= 0)) { $page = 1; } else { $page = (int) $_GET['page']; } $q=mysql_query('select SQL_CALC_FOUND_ROWS `name`, `rating`, `key`, `address`, `desc`, `src` FROM `sled_hotels` WHERE town=4 '.$str.' limit '.(($page-1)*$mpp).','.$mpp); $fr=resSQL('SELECT FOUND_ROWS()'); $num = '<div class="hotelsearchresults">По вашему запросу найдено объектов для размещения: '.$fr.' </div>'; if( $type > 0 ) {$typelink = '&type[]='.$type; } else {$typelink = null;} if( $rating > 0 ) {$ratinglink = '&rating[]='.$rating; } else {$ratinglink = null;} if( $place > 0 ) {$placelink = '&place[]='.$place; } else {$placelink = null;} $pc=ceil($fr/$mpp); $pagi = 'страниц: '; if ($pc>1) { $raz=''; for($n=1;$n<=$pc;$n++) { $pagi .= $raz; if ($page==$n) $pagi .= $n; else { $pagi .= '<A HREF="/test/?do=hotels'; if ($n>0) $pagi .= '&page='.$n.$typelink.$ratinglink.$placelink.'&submit=ПОКАЗАТЬ+ВЫБРАННОЕ'; $pagi .= '">'.$n.'</A>'; } $raz='<span style="color:#999;"> | </span>'; }$pagi .= '</div>'; } echo '</div>'; if ($_GET['submit'] = 'ПОКАЗАТЬ+ВЫБРАННОЕ') {$demo = '<div class="allresult">'; while( $r=mysql_fetch_assoc($q)) { $demo .= '<div class="eachresult"> <div class="hotelnamewhiteline"> <div class="hotelrating">'.$rat[$r['rating']].'</div> <div class="hotelname"><a href="/'.$r['key'].'.html" target="_parent"> "'.$r['name'].'" </a></div> </div> <div class="hoteladdress">'.$r['address'].'</div> <div class="hoteldescription"><a href="/'.$r['key'].'.html" target="_parent">'.$r['desc'].'</a></div> <div class="hotelphoto"><a href="/'.$r['key'].'.html" target="_parent"><img src="http://www.sgtours.ru'.$r['src'].'" border="0" width="160" height="120" style="border: 7px solid rgb(255, 255, 255); box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.3); border-radius: 7px; margin: 0px 10px 0px 0px;"></a></div> </div>'; } echo '</div>'; }else{$demo .= null;} } else {} $tpl->set( '{demo}', $demo ); $tpl->set( '{num}', $num ); $tpl->set( '{pagi}', $pagi ); $tpl->compile( 'content' ); $tpl->clear(); ?> Ошибки до выполнения скрипта. Код (Text): Notice: Undefined variable: demo in /home/site/www/test/engine/modules/hotels.php on line 204 Notice: Undefined variable: num in /home/site/www/test/engine/modules/hotels.php on line 205 Notice: Undefined variable: pagi in /home/site/www/test/engine/modules/hotels.php on line 206 Ошибки после выполнения скрипта Код (Text): Notice: Undefined variable: str in /home/site/www/test/engine/modules/hotels.php on line 35 Notice: Undefined variable: cname in /home/site/www/www/test/engine/modules/hotels.php on line 88 Notice: Undefined variable: ctel in /home/site/www/test/engine/modules/hotels.php on line 90 Notice: Undefined index: 21 in /home/site/www/test/engine/modules/hotels.php on line 92 строка 92: Тип: '.$typ[$rating].' Добавлено спустя 4 минуты 40 секунд: Re: Тупик - вывод нескольких значений из ассоциативного массива Последняя ошибка - не ошибка. Пока искал косяк - случайно попутал и вместо type написал rating
Re: Тупик - вывод нескольких значений из ассоциативного масс Апаю тему, прошу помощи или подскажите, какие еще нужно данные дать...
Re: Тупик - вывод нескольких значений из ассоциативного масс хз. я два раза читал так и не понял что не пашет
Re: Тупик - вывод нескольких значений из ассоциативного масс Есть форма такого вида: Код (Text): <form name="form" id="form" method="GET" action="/test/?do=hotels" > <input type="hidden" name="do" value="hotels" /> <div class="search4hoteltype"> <input type="checkbox" name="type[]" value="25,26"> Отель<br> <input type="checkbox" name="type[]" value="28"> Санаторий<br> <input type="checkbox" name="type[]" value="27"> Пансионат<br> </div> <div class="search4hotelrating"> <input type="checkbox" name="rating[]" value="15,17"> 2*<br> <input type="checkbox" name="rating[]" value="19"> 3*<br> <input type="checkbox" name="rating[]" value="21"> 4*<br> <input type="checkbox" name="rating[]" value="23"> 5*<br> </div> <div class="search4hotelplace"> <input type="checkbox" name="place[]" value="5"> Центр<br> <input type="checkbox" name="place[]" value="6"> Хоста<br> <input type="checkbox" name="place[]" value="7"> Адлер<br> <input type="checkbox" name="place[]" value="42"> Имеретинка<br> <input type="checkbox" name="place[]" value="8"> Красная Поляна<br> <input type="checkbox" name="place[]" value="10"> Дагомыс<br> <input type="checkbox" name="place[]" value="9"> Лазаревское<br> ваше имя<input type="text" name="clientname" size="25"> ваш eMail<input type="text" name="clientemail" size="25"> ваш телефон<input type="text" name="clienttelephone" size="25"> Дата заезда<input type="text" name="datein" class="tcal" value="выберите дату" /> Дата отъезда<input type="text" name="dateout" class="tcal" value="выберите дату" /> </div> <div class="search4hotelbuttons"> <input name="submit" value="ПОКАЗАТЬ ВЫБРАННОЕ" type="submit"> </div> </form> На ее основе все и работает. Делается запрос в базу исходя из собранных данных, результаты выводятся постранично в нужном оформлении. ПЛЮС! На электронный адрес манагера уходит письмо с данными, что отмечены клиентом. ПРОБЛЕМА: Если человек отметил один чекбокс в группе (например Отель), то в письме приходит: Отель. Если человек отметил два чекбокса в группе (например Отель и Санаторий - ну рассматривает варианты человек), то в письме не приходит ничего. И тоже самое по группам чекбоксов "рейтинг"(rating) и "расположение" (place). Максимум, что происходит - при указании в теле письма $rating, а не $typ[$rating] например, в письме приходят числовые значения выбранных пунктов, причем приходят верно. Например: Желаемый тип размещения: 27, 28. А нужны то присвоенные слова: Санаторий, Пансионат.
Re: Тупик - вывод нескольких значений из ассоциативного масс Перед отправкой на почту посмотри какие данные хранятся в переменных $_GET['type'] и $_GET['place'] может там пусто. var_dump() Что не понятно в инструкции отладки? http://phpfaq.ru/debug
Re: Тупик - вывод нескольких значений из ассоциативного масс в бд попадает, потому что там всё правино, но вы склеиваете всё это дело в одну переменную Код (Text): $rating = implode(',', $_GET['rating']); тип того, поэтому у вас Код (Text): Класс: ' . $ratt[$rating] . ' не работает, т.к. там внутре сидит что-то типа $ratt['15,17,19'], а такого у вас в Код (Text): $ratt[15] = '1*'; $ratt[17] = '2*'; $ratt[19] = '3*'; $ratt[21] = '4*'; $ratt[23] = '5*'; эссно нету. Соотв. вам надо при выводе в письмо заново собирать эти значения тип того: Код (Text): $rating = []; foreach ($_GET['rating'] as $val) { $rating[] = $ratt[$val]; } $rating = implode(', ', $rating); а потом Код (Text): Класс: ' . $rating . ' И ещё у вас инъекция в бд
Re: Тупик - вывод нескольких значений из ассоциативного масс Спасибо, сейчас попробую... Можно и нужно на ты, я ваш давний "фанат" А про инъекцию - можно поподробнее? Я, несомненно, начитаю и разберусь, характер такой, но сейчас оставлять без внимание брешь в защите - дико не хотелось бы...
Re: Тупик - вывод нескольких значений из ассоциативного масс У тебя что пришло то ты и ставишь в запрос. И если тебе кто-то пришлет запрос вместо данных, то он уйдёт в бд и исполнится. Могут быть проблемы. Нужно эскейпить. Добавлено спустя 47 минут 33 секунды: Re: Тупик - вывод нескольких значений из ассоциативного массива для безопасности вот, но она устарена, и надо юзать другие подходы, http://php.ru/manual/function.mysql-real-escape-string.html когда же кто-нить запилит топик по инъекциям?... =(
Re: Тупик - вывод нескольких значений из ассоциативного масс мне стыдно, но я не до конца понял... Так как выскакивают ошибки типа Fatal error: Cannot use [] for reading in... И знания сразу поплыли... $rating = []; foreach ($_GET['rating'] as $val) { $rating[] = $ratt[$val]; } $rating = implode(', ', $rating);
Re: Тупик - вывод нескольких значений из ассоциативного масс пхп старый, надо писать $rating = array();
Re: Тупик - вывод нескольких значений из ассоциативного масс А я еще смотрю, но думаю совсем чего-то не знаю, ваш авторитет неприложен ))) Поменял на array - все заработало как надо. Гениально, спасибо!