blackjack
NoDeny
Старожил
Карма: 24
Offline
Сообщений: 352
|
|
« : 22 Сентября 2010, 12:26:21 » |
|
Нам время от времени необходимо выбирать телефоны из базы по групам и прочим критериям. Выкладываю 2 пхп скриптика для этой операции. Если кому надо, можете модифицировать под себя как угодно, пусть ничто не останавливает полет вашей мысли cat index.php <?php $dbhost = 'localhost'; $dbuser = 'user'; $dbpass = 'pass';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error connecting to mysql');
$dbname = 'nodeny'; mysql_select_db($dbname);
$sql_grp="SELECT grp_id,grp_name FROM user_grp"; $result=mysql_query($sql_grp) or die(mysql_error());
while ($row = mysql_fetch_array($result)) { $option.="<option value=\"".$row['grp_id']."\">".$row['grp_name']."</option>"; $i++; }
echo "<form action=\"index2.php\" method=\"post\"> <select size=\"".$i."\" multiple name=\"grps[]\">".$option."</select>"; echo "<br>State off<input type=\"checkbox\" name=\"stateoff\"/><br>"; echo "Online<input type=\"checkbox\" name=\"online\"/><br>"; echo "<input type=\"submit\"></form>";
cat index2.php <?php $dbhost = 'localhost'; $dbuser = 'user'; $dbpass = 'pass';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error connecting to mysql');
$dbname = 'nodeny'; mysql_select_db($dbname);
$grps_array= $_POST['grps']; $stateoff=$_POST['stateoff']; $online=$_POST['online']; if(!isset($grps_array)) { echo("<p>You didn't select any groups!</p>\n"); } else { $ngrps = count($grps_array); for($i=0; $i < $ngrps; $i++) { $grps_array[$i]?$sql_grps.=$grps_array[$i].",":$sql_grps.=""; } $sql_grps=substr($sql_grps,0,strlen($sql_grps)-1); $query="SELECT id FROM users WHERE grp IN (".$sql_grps.")"; } if ($stateoff) { $query.=" AND state='off'"; }
if ($online) { $query.=" AND auth='on'"; } $result = mysql_query($query) or die(mysql_error()); while($row = mysql_fetch_array($result)){ $query="SELECT `field_value` FROM `dopdata` WHERE `dopfield_id`=13 AND `revision`=(SELECT max(`revision`) FROM `dopdata` WHERE `dopfield_id`=13 AND `parent_id`=".$row['id'].")"; $result1 = mysql_query($query) or die(mysql_error()); $row1=mysql_fetch_array($result1); if ( $row1['field_value'] != '') { list($tel1,$tel2)=split('[,. ?/-]',$row1['field_value']); if (strlen($tel1)>9) { echo $tel1."<br>"; } else if (strlen($tel2)>9) { echo $tel2."<br>"; } } } ?>
|
|
« Последнее редактирование: 11 Октября 2010, 13:29:02 от elite »
|
Записан
|
|
|
|
goletsa
NoDeny
Спец
Карма: 21
Offline
Сообщений: 973
|
|
« Ответ #1 : 22 Сентября 2010, 23:13:56 » |
|
У меня костылем сделано, есть отдельная таблица которая повторяет структуру users от 48 версии. Генерится по запросу, потом фильтры по улице\группе\доме делаютя тривиальным SELECT'ом. Могу куданить выложить.
|
|
|
Записан
|
|
|
|
elite
Начальник планеты
NoDeny
Спец
Карма: 52
Offline
Сообщений: 1226
In LAN we trust!
|
|
« Ответ #2 : 23 Сентября 2010, 15:08:17 » |
|
У меня костылем сделано, есть отдельная таблица которая повторяет структуру users от 48 версии. Генерится по запросу, потом фильтры по улице\группе\доме делаютя тривиальным SELECT'ом. Могу куданить выложить.
выкладывай
|
|
|
Записан
|
|
|
|
goletsa
NoDeny
Спец
Карма: 21
Offline
Сообщений: 973
|
|
« Ответ #3 : 25 Сентября 2010, 04:14:41 » |
|
Как-то так. Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов. <?php
$db_host = ""; $db_user = ""; $db_pass = ""; $db_name = "bill"; $db_connect = mysql_connect($db_host, $db_user, $db_pass); mysql_select_db($db_name, $db_connect);
#$debug=true; $debug=false;
# Info from users # id,name,grp,mid
# Get users list $query = "SELECT `id`,`name`,`grp` FROM `users` where `mid`='0'"; $result = mysql_query($query, $db_connect);
while (($row = mysql_fetch_row($result)) !== FALSE) { # Walk userlist $userid=$row[0]; $username=$row[1]; $usergrp=$row[2]; if ($debug) {echo "MID:".$userid." Login:".$username." Group:".$usergrp." ";};
# Get street $userstridq="SELECT field_value FROM dopdata WHERE revision=(SELECT MAX(revision) FROM dopdata WHERE parent_id=$userid AND field_alias='p_street:street:name_street') AND field_alias='p_street:street:name_street'"; $userstrida = mysql_fetch_array ( mysql_query($userstridq), MYSQL_NUM); $userstrid=$userstrida[0]; if ($debug) {echo "Street ID:".$userstrid." ";};
# Get house $userhouseq="SELECT field_value FROM dopdata WHERE revision=(SELECT MAX(revision) FROM dopdata WHERE parent_id=$userid AND field_alias='_adr_house') AND field_alias='_adr_house'"; $userhousea = mysql_fetch_array ( mysql_query($userhouseq), MYSQL_NUM); $userhouse=$userhousea[0]; if ($debug) {echo "House:".$userhouse." ";};
# Get room $userroomq="SELECT field_value FROM dopdata WHERE revision=(SELECT MAX(revision) FROM dopdata WHERE parent_id=$userid AND field_alias='_adr_room') AND field_alias='_adr_room'"; $userrooma = mysql_fetch_array ( mysql_query($userroomq), MYSQL_NUM); $userroom=$userrooma[0]; if ($debug) {echo "Room:".$userroom." ";};
# Get phone number $userphoneq="SELECT field_value FROM dopdata WHERE revision=(SELECT MAX(revision) FROM dopdata WHERE parent_id=$userid AND field_alias='_adr_telefon') AND field_alias='_adr_telefon'"; $userphonea = mysql_fetch_array ( mysql_query($userphoneq), MYSQL_NUM); $userphone=$userphonea[0]; if ($debug) {echo "Phone:".$userphone." ";};
# Demo SQL # INSERT INTO `sms_data` (`mid`, `login`, `group`, `street`, `house`, `room`, `phone`) VALUES (1, 'test', 2, 3, '34', 123, '13212321') ON DUPLICATE KEY UPDATE `phone`='123',`login`='test2';
$userquery="INSERT INTO `sms_data` (`mid`, `login`, `group`, `street`, `house`, `room`, `phone`) VALUES ('$userid', '$username', '$usergrp', '$userstrid', '$userhouse', '$userroom', '$userphone') ON DUPLICATE KEY UPDATE `login`='$username', `group`='$usergrp', `street`='$userstrid', `house`='$userhouse', `room`='$userroom', `phone`='$userphone';"; if ($debug) {echo "\n";}; $userupdate = mysql_query($userquery, $db_connect); if ($debug) {echo $userquery;}; if ($debug) {echo "\n";};
};
?> CREATE TABLE IF NOT EXISTS `sms_data` ( `mid` int(11) NOT NULL, `login` varchar(20) NOT NULL, `group` int(11) NOT NULL, `street` int(11) NOT NULL, `house` varchar(10) NOT NULL, `room` int(11) NOT NULL, `phone` varchar(50) NOT NULL, PRIMARY KEY (`mid`), UNIQUE KEY `mid` (`mid`), UNIQUE KEY `login` (`login`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
|
|
|
Записан
|
|
|
|
ale-x
NoDeny
Постоялец
Карма: 1
Offline
Сообщений: 164
|
|
« Ответ #4 : 06 Октября 2010, 10:03:24 » |
|
Как-то так. Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов.
Не подскажете как подправить запрос на выборку телефона чтобы номер начинался на 0 и содержал только первые 10 цифр? А то в базе есть городские, городской и мобильный в одном поле.
|
|
|
Записан
|
|
|
|
goletsa
NoDeny
Спец
Карма: 21
Offline
Сообщений: 973
|
|
« Ответ #5 : 06 Октября 2010, 11:17:58 » |
|
Как-то так. Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов.
Не подскажете как подправить запрос на выборку телефона чтобы номер начинался на 0 и содержал только первые 10 цифр? А то в базе есть городские, городской и мобильный в одном поле. Отдельный скрипт делает preg_match по шаблону вида 8-XXX-XXX-XX-XX Я заставляю операторов вводить мобилы в таком формате.
|
|
|
Записан
|
|
|
|
Aivanzipper
NoDeny
Старожил
Карма: 62
Offline
Сообщений: 387
|
|
« Ответ #6 : 06 Октября 2010, 11:45:59 » |
|
Как-то так. Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов.
Не подскажете как подправить запрос на выборку телефона чтобы номер начинался на 0 и содержал только первые 10 цифр? А то в базе есть городские, городской и мобильный в одном поле. Перлом без проблем обработал-бы. А для мускула нашел вот это и не осилил))
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #7 : 07 Октября 2010, 19:45:43 » |
|
Наблюдал я за топиком, кол-во просмотров росло, даже ответы стали появляться. А никто так и не написал автору "респект"... Хоть бы кто заметил ЗДОРОВЕННУЮ дыру в безопасности!
|
|
|
Записан
|
|
|
|
blackjack
NoDeny
Старожил
Карма: 24
Offline
Сообщений: 352
|
|
« Ответ #8 : 07 Октября 2010, 21:22:48 » |
|
ну что же вы молчите ткните где же та здоровенная черная дыра
|
|
|
Записан
|
|
|
|
VitalVas
NoDeny
Спец
Карма: 60
Offline
Сообщений: 991
|
|
« Ответ #9 : 07 Октября 2010, 21:57:37 » |
|
как где...?? в передачи параметров
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #10 : 07 Октября 2010, 23:27:58 » |
|
$grps_array= $_POST['grps']; $stateoff=$_POST['stateoff']; $online=$_POST['online']; if(!isset($grps_array)) { echo("<p>You didn't select any groups!</p>\n"); } else { $ngrps = count($grps_array); for($i=0; $i < $ngrps; $i++) { $grps_array[$i]?$sql_grps.=$grps_array[$i].",":$sql_grps.=""; } $sql_grps=substr($sql_grps,0,strlen($sql_grps)-1); $query="SELECT id FROM users WHERE grp IN (".$sql_grps.")";
Где фильтрация параметров? Подставляй что хош, и получай, без затруднений слепой скуль, а если постараться, то и с выводом результатов. P.S. И еще... Весь это бред с циклом можно заменить простой ф-ей implodeАх да, и запрос по выбору телефонов не самый удачный.
|
|
« Последнее редактирование: 07 Октября 2010, 23:30:04 от 0xbad0c0d3 »
|
Записан
|
|
|
|
blackjack
NoDeny
Старожил
Карма: 24
Offline
Сообщений: 352
|
|
« Ответ #11 : 08 Октября 2010, 12:08:26 » |
|
пусть ничто не останавливает полет вашей мысли
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #12 : 08 Октября 2010, 20:13:59 » |
|
|
|
|
Записан
|
|
|
|
goletsa
NoDeny
Спец
Карма: 21
Offline
Сообщений: 973
|
|
« Ответ #13 : 09 Октября 2010, 07:45:38 » |
|
$grps_array= $_POST['grps']; $stateoff=$_POST['stateoff']; $online=$_POST['online']; if(!isset($grps_array)) { echo("<p>You didn't select any groups!</p>\n"); } else { $ngrps = count($grps_array); for($i=0; $i < $ngrps; $i++) { $grps_array[$i]?$sql_grps.=$grps_array[$i].",":$sql_grps.=""; } $sql_grps=substr($sql_grps,0,strlen($sql_grps)-1); $query="SELECT id FROM users WHERE grp IN (".$sql_grps.")";
Где фильтрация параметров? Подставляй что хош, и получай, без затруднений слепой скуль, а если постараться, то и с выводом результатов. P.S. И еще... Весь это бред с циклом можно заменить простой ф-ей implodeАх да, и запрос по выбору телефонов не самый удачный. Напишите лучше. И какой именно скрипт\цикл\запрос. По поводу sql инъекций - все скрипты отправки надо закрывать .htaccess'ом на ip адреса офиса и логин с паролем. Такие вещи оставлять в открытую глупо. Или ктото из своих чтото будет делать?
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #14 : 09 Октября 2010, 09:10:23 » |
|
будет, не будет, а делать нужно так, что б не оставлять лазеек! А насчет скрипта: for($i=0; $i < $ngrps; $i++) { $grps_array[$i]?$sql_grps.=$grps_array[$i].",":$sql_grps.=""; } можно заменить одной строкой $sql_grps = implode(',',$grps_array); Перед этим нужно еще отфильтровать массив. array_walk, например или foreach
|
|
|
Записан
|
|
|
|
|