За последние 24 часа нас посетили 51385 программистов и 1758 роботов. Сейчас ищут 688 программистов ...

Остановка цикла

Тема в разделе "PHP для новичков", создана пользователем 715kg, 1 май 2015.

  1. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    Здравствуйте. Много читал про это в мануалах, но видимо я бестолковый. До сих пор не понял как реализовать.

    Задача такая. Нужно остановить цикл при определенном условии и не выполнять дальше.
    Покажу пример:

    Код (PHP):
    1. //Чтение существующих серверов
    2. $loc_z = $db->query("SELECT id, name, col FROM box ORDER BY id LIMIT 0,100");
    3.  
    4. //Выводим их всех
    5. while($loc = mysql_fetch_array($loc_z)){
    6.  
    7. //Условие.
    8.  
    9. if($loc['col'] == 1){ 
    10.  
    11. //Выполняем определенное действие и останавливаемся на этом, не чекая далее
    12.  
    13. }
    14.  
    15. }
    16.  
    17.  
    То есть принцип такой. Нужно выполнить в условии действие и на этом закончить.
    Но у меня получается, то что условие выполняется при $loc['col'] == 1
    Так как в базе несколько строчек с $loc['col'] == 1
    Цикл выводит все и на каждое $loc['col'] == 1 выполняется. А нужно только на первое попавшиеся и все. Остальные что бы даже не чекал.

    Надеюсь понятно обьяснил. Заранее большое спасибо. Надеюсь может кто правильную ссылочку хоть даст почитать.
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    волшебное слово break:



    Код (PHP):
    1.     //Чтение существующих серверов
    2.     $loc_z = $db->query("SELECT id, name, col FROM box ORDER BY id LIMIT 0,100");
    3.  
    4.     //Выводим их всех
    5.     while($loc = mysql_fetch_array($loc_z)){
    6.  
    7.     //Условие.
    8.  
    9.     if($loc['col'] == 1){ 
    10.  
    11.     //Выполняем определенное действие и останавливаемся на этом, не чекая далее
    12.     break;
    13.     }
    14.  
    15.     } 
    и еще, mysql_ устарело, надо использовать mysqli_
     
  3. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    О боже, вы великолепны. Спасибо огромное. Сейчас почитай про (break;) более подробно.

    Вопрос, чем отличается mysql_ от mysqli_ ?? Ведь с mysql работает отлично даже на 5.5 php
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    mysqli улучшенный mysql и если включить вывод ошибок (подробный), то должно выдавать предупреждение что функция "гнилая", а когда функция гнилая, это значит что через пару версий ее уберут из использования, по этому долго этот код работать не будет.
     
  5. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    Благодарю. Сейчас исправлю.
    То есть и в коннекте и везде где есть mysql_ нужно заменить на mysqli_ ?
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    когда его неожиданно выпилят и придется с горящей жопой переносить код на импрувд ты поймешь что пять лет которые дали на переход с устаревшего расширения на современное нужно было не глупые вопросы задавать а переходить с устаревшего на современное. тем более апи не сильно отличаются и в целом модификация в лучшую и более понятную сторону.
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну перед тем как менять надо посмотреть в справочнике, что принимает и что отдает, а то может изменился список параметров и то что возвращает функция, по научному все вместе это называется прототип функции.

    Так же желательно использовать классы, а не функции, все программирование переходит на классы, на ООП, уже существуют языки в которых нет просто функций, зачем же тогда пользоваться тем, что морально устарело, пускай даже оно проще.

    И еще очень желательно включить вывод всех ошибок, т.к. список гнилых функция больше чем только mysql_, делается это вроде как так:
    Код (PHP):
    1. // в самом начале страницы:
    2. ini_set('display_errors',1);
    3. ini_set("error_reporting", E_ALL); 
    Добавлено спустя 1 минуту 34 секунды:
    видимо знает о чем говорит :)
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    лучше всего делать это в настройках пхп в целом чтоб не нужно было пихать постоянно включалку вывода во все сценарии. исправление ошибок и нотисов ведь обязательно на этапе разработки. а когда готов стабильный код - можно тестировать на сервере с продакшн настройками - тогда ошибки если и будут (хотя откуда, да?) то на экране не покажутся но запишутся в файл. и потом при выгрузке на продакшн не придется выпиливать из всех скриптов строки включающие отладку.
    вот.
     
  9. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    Заменил везде mysql_ на mysqli_

    Код (PHP):
    1. if( ! defined( 'GameAmx.ru_Monitoring' ) ) {die( "hacking attempt!" );}
    2.  
    3. include ENGINE_DIR .'class.config.db.php'; //Конфиг
    4. $db = new database($configdb['db_host'], $configdb['db_user'], $configdb['db_password'], $configdb['db_name']); 
    5.  
    6. class database { 
    7.  
    8. /* VARIABLES */ 
    9. private $conn = false; 
    10. private $data = array(); 
    11.  
    12. /* PUBLIC FUNCTIONS*/ 
    13.  
    14. public function query($request, $data = array()) { 
    15. $error = 1; //Включить вывод показа запроса при ошибки. 1-ДА 0-НЕТ //
    16. if($error != 0){
    17. $error = "Cannot execute request to the database - ".$request;
    18. }else{
    19. $error = '<b>Ошибка запроса db. Для детальной информации запроса, включите вывод ошибок Mysql в class.config.php</b>';
    20. }
    21.  
    22. $request = $this->query_process($request, $data); 
    23. $query = mysqli_query($request, $this->conn) or die("{$error}"); 
    24. return $query; 
    25. } 
    26.  
    27.  
    28.  
    29.  
    30. public function __construct($host, $user, $pass, $base) { 
    31. $this->conn = @mysqli_connect($host, $user, $pass) or die("<center><b>No connect Mysql server</b><br></center>"); 
    32. mysqli_select_db($base, $this->conn) or die("<center><b>No database Mysql</b><br></center>"); 
    33. mysqli_query("SET NAMES 'utf8'", $this->conn); 
    34. } 
    35.  
    36. public function insert($request, $data, $column){ 
    37. $request = $this->query_process($request, $data); 
    38. $query = mysqli_query($request, $this->conn) or die("Cannot execute request to the database '{$request}'"); 
    39. $query = mysqli_query("SELECT last_insert_id() as `{$column}`", $this->conn); 
    40. $array = $this->result2array($query); 
    41. return isset($array[0][$column]) ? $array[0][$column] : 0; 
    42. } 
    43.  
    44.  
    45.  
    46.  
    47.  
    48.  
    49.  
    50. public function select($request, $data = array()) { 
    51. $request = $this->query_process($request, $data); 
    52. $query = false; 
    53. $query = mysqli_query($request, $this->conn) or die("Cannot execute request to the database '{$request}'"); 
    54. return $this->result2array($query); 
    55. } 
    56.  
    57.  
    58. /* PRIVATE FUNCTIONS */ 
    59.  
    60. private function holders_replace($matches){ 
    61. $placeholder = $matches[2]; 
    62. if(!isset($this->data[$placeholder])) throw new Exception("No data for placeholder '{{$placeholder}}'"); 
    63. // process IN({list}) values 
    64. if(is_array($this->data[$placeholder])){ 
    65. $data = array(); 
    66. foreach($this->data[$placeholder] as $v) $data[] = mysqli_real_escape_string($v); 
    67. $value = implode("', '", $data); 
    68. } else { 
    69. $value = mysqli_real_escape_string($this->data[$placeholder]); 
    70. } 
    71. return "'{$value}'"; 
    72. } 
    73.  
    74. private function query_process($query, $data){ 
    75. $this->data = $data; 
    76. $query = preg_replace_callback("#('?){([^}]+)}(\\1)#sUi", array($this, 'holders_replace'), $query); 
    77. return $query; 
    78. } 
    79.  
    80. private function result2array(&$query){ 
    81. $result = array(); 
    82. $i = 0; 
    83.  
    84. if($query === false) { return $result; } 
    85. while($row = mysqli_fetch_array($query)) { 
    86. $result[$i] = array(); 
    87. foreach($row as $key=>$value) { 
    88. if(!is_numeric($key)) { $result[$i][strtolower($key)] = $value; } 
    89. } 
    90. $i++; 
    91. } 
    92. return $result; 
    93. } 
    94.  
    95. } 
    Теперь он пишет что нету базы данных. В чем я прогадался?

    Добавлено спустя 1 минуту 29 секунд:
    А если у меня все файлы подключены к Index.php ???
    Каждый файл имеет if( ! defined( 'GameAmx.ru_Monitoring' ) ) {die( "hacking attempt!" );}
    Все идет через Index отдельных нету.
    Можно просто в index прописать это?
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в том что ты ТУПО добавил один символ к имени функции не обратив внимание на то как с ней работать надо. например первым аргументом она линк всасывает а у тебя... ну ты понял
     
  11. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    Например так

    Код (PHP):
    1. header('Content-Type: text/html; charset=utf-8');
    2. error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE );
    3. ini_set ( 'display_errors', true );
    4. ini_set ( 'html_errors', false );
    5. ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );
    Добавлено спустя 35 секунд:
    Дошло, спасибо.
     
  12. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Код (PHP):
    1. $this->conn = @mysqli_connect($host, $user, $pass) or die("<center><b>No connect Mysql server</b><br></center>");
    так делать не хорошо, нужно использовать try - catch конструкцию

    и под ошибки создать отдельный класс, который будет обрабатывать ошибки.

    Добавлено спустя 3 минуты 54 секунды:
    Код (PHP):
    1. include ENGINE_DIR .'class.config.db.php'; //Конфиг
    2. $db = new database($configdb['db_host'], $configdb['db_user'], $configdb['db_password'], $configdb['db_name']); 
    данная хрень, тоже хрень, откуда берется $configdb, она создается в файле class.config.db.php? это плохо, должно быть так, файл должен заканчиваться return, примерно как то так:

    Код (PHP):
    1. $temp = array(
    2. 'db_host' => '',
    3. 'db_user' => '',
    4. 'db_password' => '',
    5. 'db_name' => ''
    6. );
    7. return $temp; 
    а потом просто:
    Код (PHP):
    1. $configdb = include ENGINE_DIR .'class.config.db.php'; 
    include в данном случае вернет массив, короче то, что будет возвращать return в файле.
     
  13. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    Вот содержание config

    Код (Text):
    1. if( ! defined( 'GameAmx.ru_Monitoring' ) ) {die( "hacking attempt!" );}
    2.  
    3. $configdb = array(
    4.     'db_host' => 'localhost', //Адрес mysql
    5.     'db_user' => 'root',  //Пользователь
    6.     'db_password' => '3453',  //Пароль mysql
    7.     'db_name' => '345345'   //Название базы данных
    8.     );
    9.    
    Что не так? Почему нельзя так делать?
    if( ! defined( 'GameAmx.ru_Monitoring' ) ) {die( "hacking attempt!" );}
    Не даст вызвать файл из глобальной области

    Добавлено спустя 1 минуту 43 секунды:
    $configdb = include ENGINE_DIR .'class.config.db.php';

    Я так понимаю задействует include только к скрипту, который вызывает $configdb ?
     
  14. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    почему нельзя, можно, но плохо, чисто с точки зрения.. хз какой, так тебе надо будет каждый раз заглядывать в этот файл - class.config.db.php да бы знать как именно называется переменная, ну потому что не зная как она называется ей не воспользоваться, а в моем примере тебе не надо волноваться за то, как она называется, тебе просто надо будет знать что данный файл возвращает.

    Это может показаться мелочью, но со временем, с практикой и с увеличение объемов кода, это уже станет головной болью.

    Добавлено спустя 1 минуту 30 секунд:
    если у тебя в конце файла стоит стоит return что то, то include будет возвращать этот что то, а не что он там должен (удалось / не удалось).
     
  15. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    Я новичок. Делаю все как описано в мануале php, по примерам.
    Для удобства добавляю функции и прочие, что знаю.
    В php есть много нюансов, о которых я не знаю. Узнаю со временем. Но некоторые не поддаются моей логике видимо.
    И прочитать (Как можно сделать а как хрень) у меня не получается. Ведь если код работает, так как я новичок, мне сложно понять, а можно ли так делать?

    Добавлено спустя 1 минуту 24 секунды:
    Теперь я понял, спасибо за совет.

    Что касается
    Код (Text):
    1.  
    2. $this->conn = @mysqli_connect($host, $user, $pass) or die("<center><b>No connect Mysql server</b><br></center>");
    Что тут не так?

    Добавлено спустя 4 минуты 55 секунд:
    Кстате, спасибо огромное за подсказку с включением ошибок. Только подрубил в index. Как тут же весь мой код полетел. Вылезло куча ошибок с устаревшими функциями. Буду исправлять
     
  16. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Я изучал РНР по вроде как толковой книге, по отзывам, но там очень много было не правильно, в смысле в логике использования, не знаю, есть ли нормальные книги где бы описывалось по мимо как и что, как правильно писать, концепции, подходы, а как не стоит, что бы например было описано MVC, я столько мучался, пока сочинял свою схему взаимодействия всего со всем и почти придумал MVC :)

    ну представь что ты решишь сделать красивый вывод ошибок, в отдельном шаблоне или же производить по мимо вывода ошибок запись их в файл, что тогда? переписывать кучу кода?

    надо сделать функцию которая будет за это отвечать и решать, делать die или нет, что то типа

    Код (PHP):
    1. function error_controller($place, $message, $critical = true)
    2. {
    3.     echo "<h3>Eror!</h3>";
    4.     echo "<div>{$message}</div>";
    5.     
    6.     if ($critical) // ну может будут случае когда не стоит умирать :)
    7.     {
    8.         die();
    9.     }
    10. }
    11.  
    12. $this->conn = @mysqli_connect($host, $user, $pass) or error_controller('db.php', 'No connect Mysql server');
    а потом вдруг решишь записывать все в файл и тогда легким движение надо будет дополнить всего одну функцию, а не переписывать уйму кода.

    Добавлено спустя 5 минут 33 секунды:
    т.е. если просто die, оно ограничивает действия, если ты вдруг решишь их расширить, то тебе надо будет переписывать кучу кода
     
  17. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    Ууууууу. Да вы батенька гурман :) У каждого свой подход) Есть много решений и удобств

    Добавлено спустя 2 минуты 57 секунд:
    Кстате твоя функция хороша тем, что сразу можно понять в каком файле ошибка))) Спасибо, заюзаю)
     
  18. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    подход? может быть, но то что было до этого это не правильно, даже примитивно. Ну а за приметив много не платят и не ценят :) и создаются такие темы - viewtopic.php?f=13&t=49006

    кстати, опять же я не совсем правильно написал, вот так будет правильнее:
    Код (PHP):
    1. function error_controller(Exception $exception, $critical = true, $default_value = NULL) 
    2. // Exception $exception - заставит что бы данный параметр был только объект класса Exception 
    3. {
    4.     echo "<h3>Error!</h3>";
    5.     echo "<div>message: ". $exception->getMessage() ."</div>";
    6.     echo '<div>file: '. $exception->getFile() .'</div>';
    7.     // и дальше смотри все методы класса Exception, там и номер строки будет писать и еще много чего
    8.     if ($critical) // ну может будут случае когда не стоит умирать :)
    9.     {
    10.         die();
    11.     }
    12.     return $default_value;
    13. }
    кода больше, но и возможностей и информации больше:
    Код (PHP):
    1. $this->conn = @mysqli_connect($host, $user, $pass) or false;
    2.  
    3. if ($this->conn === false)
    4. {
    5.     $e = new Exception('No connect Mysql server', 911);
    6.     error_controller($e);
    7. }
    в принципе можно и еще укоротить, но я уже не буду :)
     
  19. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    Так, созрел еще вопрос. Начал заменять устаревшие функции.
    Возникла ошибка.

    Код (PHP):
    1. $this->template = preg_replace( "#\\{file=['\"](.+?)['\"]\\}#ies","\$this->sub_load_template('\\1')", $this->template);
    2. //Заменил на 
    3. $this->template = preg_replace_callback( "#\\{file=['\"](.+?)['\"]\\}#ies","\$this->sub_load_template('\\1')", $this->template);
    4.  
    Работать перестало. Код работал так. Искал в {file=""} Имя файлы. Например {file="index.tpl"}
    Далее выполнял $this->sub_load_template('\\1') Подставил в место 1 имя файла.
    $this->template это вывод всего содержимого, для поиска.

    В Регулярках я бум бум. Хотя и читал много. Так и не дошло понял принцип работы.
     
  20. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    найди видео на youtube.com:
    PHP:
    1. Регулярные выражения(Урок 21)
    2. Javascript-джедай #28 - Регулярные выражения
    3. процентов на 70% все станет ясно, ну а дальше шпаргалку в помощь найдешь.
     
  21. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
     
  22. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а можно ссылку на статью где написано что именно так пользоваться данной функцией? миллион других работающих примеров видел а вот такую штуку впервые. и не удивлен что она не работает. она похоже на тупую замену прег_реплейса с модификатором е на прег_реплейс_колбек без модификатора е.
     
  23. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    То есть примерно так?
    Код (PHP):
    1.  function load($z) 
    2.   {
    3.   
    4.     $this->sub_load_template($z);
    5.   }
    6.  
    7.  $this->template = preg_replace_callback( "#\{file=\"(.*)\"}#ie","load", $this->template);
    8.  
    9.  
    10.  
     
  24. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    715kg можно ещё через анонимную функцию
     
  25. 715kg

    715kg Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    147
    Симпатии:
    0
    Это как?