Биллинговая система Nodeny

Главная категория => Разработка => Тема начата: blackjack от 22 Сентября 2010, 12:26:21



Название: Выбор телефонов на PHP
Отправлено: blackjack от 22 Сентября 2010, 12:26:21
Нам время от времени необходимо выбирать телефоны из базы по групам и прочим критериям. Выкладываю 2 пхп скриптика для этой операции. Если кому надо, можете модифицировать под себя как угодно, пусть ничто не останавливает полет вашей мысли  ;D
Код:
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>";
        }
    }
    }
?>



Название: Re: Выбор телефонов на PHP
Отправлено: goletsa от 22 Сентября 2010, 23:13:56
У меня костылем сделано, есть отдельная таблица которая повторяет структуру users от 48 версии.
Генерится по запросу, потом фильтры по улице\группе\доме делаютя тривиальным SELECT'ом.
Могу куданить выложить.


Название: Re: Выбор телефонов на PHP
Отправлено: elite от 23 Сентября 2010, 15:08:17
У меня костылем сделано, есть отдельная таблица которая повторяет структуру users от 48 версии.
Генерится по запросу, потом фильтры по улице\группе\доме делаютя тривиальным SELECT'ом.
Могу куданить выложить.

выкладывай :)


Название: Re: Выбор телефонов на PHP
Отправлено: goletsa от 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;


Название: Re: Выбор телефонов на PHP
Отправлено: ale-x от 06 Октября 2010, 10:03:24
Как-то так.
Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов.
Не подскажете как подправить запрос на выборку телефона чтобы номер начинался на 0 и содержал только первые 10 цифр? А то в базе есть городские, городской и мобильный в одном поле.


Название: Re: Выбор телефонов на PHP
Отправлено: goletsa от 06 Октября 2010, 11:17:58
Как-то так.
Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов.
Не подскажете как подправить запрос на выборку телефона чтобы номер начинался на 0 и содержал только первые 10 цифр? А то в базе есть городские, городской и мобильный в одном поле.
Отдельный скрипт делает preg_match по шаблону вида 8-XXX-XXX-XX-XX
Я заставляю операторов вводить мобилы в таком формате.


Название: Re: Выбор телефонов на PHP
Отправлено: Aivanzipper от 06 Октября 2010, 11:45:59
Как-то так.
Может и не очень оптимально, базу на 5к записей обрабатывает за 14 секунд, стартует по крону раз в пару часов.
Не подскажете как подправить запрос на выборку телефона чтобы номер начинался на 0 и содержал только первые 10 цифр? А то в базе есть городские, городской и мобильный в одном поле.

Перлом без проблем обработал-бы. А для мускула нашел вот это (http://www.mysql.ru/docs/man/Regexp.html) и не осилил))  :-[


Название: Re: Выбор телефонов на PHP
Отправлено: 0xbad0c0d3 от 07 Октября 2010, 19:45:43
Наблюдал я за топиком, кол-во просмотров росло, даже ответы стали появляться.
А никто так и не написал автору "респект"...
Хоть бы кто заметил ЗДОРОВЕННУЮ дыру в безопасности!


Название: Re: Выбор телефонов на PHP
Отправлено: blackjack от 07 Октября 2010, 21:22:48
ну что же вы молчите ткните где же та здоровенная черная дыра


Название: Re: Выбор телефонов на PHP
Отправлено: VitalVas от 07 Октября 2010, 21:57:37
как где...??
в передачи параметров


Название: Re: Выбор телефонов на PHP
Отправлено: 0xbad0c0d3 от 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 (http://ua2.php.net/manual/en/function.implode.php)
Ах да, и запрос по выбору телефонов не самый удачный.


Название: Re: Выбор телефонов на PHP
Отправлено: blackjack от 08 Октября 2010, 12:08:26
Цитировать
пусть ничто не останавливает полет вашей мысли


Название: Re: Выбор телефонов на PHP
Отправлено: 0xbad0c0d3 от 08 Октября 2010, 20:13:59
 ;D


Название: Re: Выбор телефонов на PHP
Отправлено: goletsa от 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 (http://ua2.php.net/manual/en/function.implode.php)
Ах да, и запрос по выбору телефонов не самый удачный.
Напишите лучше.
И какой именно скрипт\цикл\запрос.
По поводу sql инъекций - все скрипты отправки надо закрывать .htaccess'ом на ip адреса офиса и логин с паролем.
Такие вещи оставлять в открытую глупо.
Или ктото из своих чтото будет делать?


Название: Re: Выбор телефонов на PHP
Отправлено: 0xbad0c0d3 от 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


Название: Re: Выбор телефонов на PHP
Отправлено: blackjack от 09 Октября 2010, 21:21:02
это все конечно круто, но я не профессиональный программист PHP. Где-то 2 года назад читал книжку "Искусство программирования для UNIX" Э. Реймонд.
Так вот, то что мне надо, моя программа выполняет, и делает это просто, разберется даже школьник.
А вопросы инъекций итд, это дело безопасности которую можно настроить на уровне web-сервера абсолютно ничего не изменяя в коде скрипта. Ограничить доступ к каталогу по IP, поставить пароль, настроить фаерволл,разрешить доступ только по SSL, .....


Название: Re: Выбор телефонов на PHP
Отправлено: 0xbad0c0d3 от 10 Октября 2010, 00:31:51
Ладно, это уже пошел оффтоп.
Но ты не прав!


Название: Re: Выбор телефонов на PHP
Отправлено: Elisium от 10 Октября 2010, 01:06:13
Ладно, это уже пошел оффтоп.
Но ты не прав!

Все приходит с опытом.
Если ты такой умный, что бы критиковать то, что другие СДЕЛАЛИ, то исправь, как НАДО и выложи тут.
Все скажут тебе большое спасибо.


Название: Re: Выбор телефонов на PHP
Отправлено: 0xbad0c0d3 от 11 Октября 2010, 00:54:09
Опыт приходит быстрее если есть критика! ;)


Название: Re: Выбор телефонов на PHP
Отправлено: 0xbad0c0d3 от 11 Октября 2010, 10:38:42
... как НАДО и выложи тут...