Биллинговая система Nodeny
28 Апреля 2024, 06:44:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1] 2
  Печать  
Автор Тема: Выбор телефонов на PHP  (Прочитано 8977 раз)
blackjack
NoDeny
Старожил
*

Карма: 24
Offline Offline

Сообщений: 352


Просмотр профиля Email
« : 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 Offline

Сообщений: 973


Просмотр профиля
« Ответ #1 : 22 Сентября 2010, 23:13:56 »

У меня костылем сделано, есть отдельная таблица которая повторяет структуру users от 48 версии.
Генерится по запросу, потом фильтры по улице\группе\доме делаютя тривиальным SELECT'ом.
Могу куданить выложить.
Записан
elite
Начальник планеты
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1227

In LAN we trust!

358714596
Просмотр профиля
« Ответ #2 : 23 Сентября 2010, 15:08:17 »

У меня костылем сделано, есть отдельная таблица которая повторяет структуру users от 48 версии.
Генерится по запросу, потом фильтры по улице\группе\доме делаютя тривиальным SELECT'ом.
Могу куданить выложить.

выкладывай Улыбающийся
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline 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 Offline

Сообщений: 164


Просмотр профиля
« Ответ #4 : 06 Октября 2010, 10:03:24 »

Как-то так.
Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов.
Не подскажете как подправить запрос на выборку телефона чтобы номер начинался на 0 и содержал только первые 10 цифр? А то в базе есть городские, городской и мобильный в одном поле.
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #5 : 06 Октября 2010, 11:17:58 »

Как-то так.
Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов.
Не подскажете как подправить запрос на выборку телефона чтобы номер начинался на 0 и содержал только первые 10 цифр? А то в базе есть городские, городской и мобильный в одном поле.
Отдельный скрипт делает preg_match по шаблону вида 8-XXX-XXX-XX-XX
Я заставляю операторов вводить мобилы в таком формате.
Записан
Aivanzipper
NoDeny
Старожил
*

Карма: 62
Offline Offline

Сообщений: 387


206967443
Просмотр профиля
« Ответ #6 : 06 Октября 2010, 11:45:59 »

Как-то так.
Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов.
Не подскажете как подправить запрос на выборку телефона чтобы номер начинался на 0 и содержал только первые 10 цифр? А то в базе есть городские, городской и мобильный в одном поле.

Перлом без проблем обработал-бы. А для мускула нашел вот это и не осилил))  Обеспокоенный
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #7 : 07 Октября 2010, 19:45:43 »

Наблюдал я за топиком, кол-во просмотров росло, даже ответы стали появляться.
А никто так и не написал автору "респект"...
Хоть бы кто заметил ЗДОРОВЕННУЮ дыру в безопасности!
Записан
blackjack
NoDeny
Старожил
*

Карма: 24
Offline Offline

Сообщений: 352


Просмотр профиля Email
« Ответ #8 : 07 Октября 2010, 21:22:48 »

ну что же вы молчите ткните где же та здоровенная черная дыра
Записан
VitalVas
NoDeny
Спец
*

Карма: 60
Offline Offline

Сообщений: 991



Просмотр профиля WWW
« Ответ #9 : 07 Октября 2010, 21:57:37 »

как где...??
в передачи параметров
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline 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 Offline

Сообщений: 352


Просмотр профиля Email
« Ответ #11 : 08 Октября 2010, 12:08:26 »

Цитировать
пусть ничто не останавливает полет вашей мысли
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #12 : 08 Октября 2010, 20:13:59 »

 Смеющийся
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline 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 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
Записан
Страниц: [1] 2
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!