Здравствуйте. Много читал про это в мануалах, но видимо я бестолковый. До сих пор не понял как реализовать. Задача такая. Нужно остановить цикл при определенном условии и не выполнять дальше. Покажу пример: Код (PHP): //Чтение существующих серверов $loc_z = $db->query("SELECT id, name, col FROM box ORDER BY id LIMIT 0,100"); //Выводим их всех while($loc = mysql_fetch_array($loc_z)){ //Условие. if($loc['col'] == 1){ //Выполняем определенное действие и останавливаемся на этом, не чекая далее } } То есть принцип такой. Нужно выполнить в условии действие и на этом закончить. Но у меня получается, то что условие выполняется при $loc['col'] == 1 Так как в базе несколько строчек с $loc['col'] == 1 Цикл выводит все и на каждое $loc['col'] == 1 выполняется. А нужно только на первое попавшиеся и все. Остальные что бы даже не чекал. Надеюсь понятно обьяснил. Заранее большое спасибо. Надеюсь может кто правильную ссылочку хоть даст почитать.
волшебное слово break: Код (PHP): //Чтение существующих серверов $loc_z = $db->query("SELECT id, name, col FROM box ORDER BY id LIMIT 0,100"); //Выводим их всех while($loc = mysql_fetch_array($loc_z)){ //Условие. if($loc['col'] == 1){ //Выполняем определенное действие и останавливаемся на этом, не чекая далее break; } } и еще, mysql_ устарело, надо использовать mysqli_
О боже, вы великолепны. Спасибо огромное. Сейчас почитай про (break более подробно. Вопрос, чем отличается mysql_ от mysqli_ ?? Ведь с mysql работает отлично даже на 5.5 php
mysqli улучшенный mysql и если включить вывод ошибок (подробный), то должно выдавать предупреждение что функция "гнилая", а когда функция гнилая, это значит что через пару версий ее уберут из использования, по этому долго этот код работать не будет.
когда его неожиданно выпилят и придется с горящей жопой переносить код на импрувд ты поймешь что пять лет которые дали на переход с устаревшего расширения на современное нужно было не глупые вопросы задавать а переходить с устаревшего на современное. тем более апи не сильно отличаются и в целом модификация в лучшую и более понятную сторону.
ну перед тем как менять надо посмотреть в справочнике, что принимает и что отдает, а то может изменился список параметров и то что возвращает функция, по научному все вместе это называется прототип функции. Так же желательно использовать классы, а не функции, все программирование переходит на классы, на ООП, уже существуют языки в которых нет просто функций, зачем же тогда пользоваться тем, что морально устарело, пускай даже оно проще. И еще очень желательно включить вывод всех ошибок, т.к. список гнилых функция больше чем только mysql_, делается это вроде как так: Код (PHP): // в самом начале страницы: ini_set('display_errors',1); ini_set("error_reporting", E_ALL); Добавлено спустя 1 минуту 34 секунды: видимо знает о чем говорит
лучше всего делать это в настройках пхп в целом чтоб не нужно было пихать постоянно включалку вывода во все сценарии. исправление ошибок и нотисов ведь обязательно на этапе разработки. а когда готов стабильный код - можно тестировать на сервере с продакшн настройками - тогда ошибки если и будут (хотя откуда, да?) то на экране не покажутся но запишутся в файл. и потом при выгрузке на продакшн не придется выпиливать из всех скриптов строки включающие отладку. вот.
Заменил везде mysql_ на mysqli_ Код (PHP): if( ! defined( 'GameAmx.ru_Monitoring' ) ) {die( "hacking attempt!" );} include ENGINE_DIR .'class.config.db.php'; //Конфиг $db = new database($configdb['db_host'], $configdb['db_user'], $configdb['db_password'], $configdb['db_name']); class database { /* VARIABLES */ private $conn = false; private $data = array(); /* PUBLIC FUNCTIONS*/ public function query($request, $data = array()) { $error = 1; //Включить вывод показа запроса при ошибки. 1-ДА 0-НЕТ // if($error != 0){ $error = "Cannot execute request to the database - ".$request; }else{ $error = '<b>Ошибка запроса db. Для детальной информации запроса, включите вывод ошибок Mysql в class.config.php</b>'; } $request = $this->query_process($request, $data); $query = mysqli_query($request, $this->conn) or die("{$error}"); return $query; } public function __construct($host, $user, $pass, $base) { $this->conn = @mysqli_connect($host, $user, $pass) or die("<center><b>No connect Mysql server</b><br></center>"); mysqli_select_db($base, $this->conn) or die("<center><b>No database Mysql</b><br></center>"); mysqli_query("SET NAMES 'utf8'", $this->conn); } public function insert($request, $data, $column){ $request = $this->query_process($request, $data); $query = mysqli_query($request, $this->conn) or die("Cannot execute request to the database '{$request}'"); $query = mysqli_query("SELECT last_insert_id() as `{$column}`", $this->conn); $array = $this->result2array($query); return isset($array[0][$column]) ? $array[0][$column] : 0; } public function select($request, $data = array()) { $request = $this->query_process($request, $data); $query = false; $query = mysqli_query($request, $this->conn) or die("Cannot execute request to the database '{$request}'"); return $this->result2array($query); } /* PRIVATE FUNCTIONS */ private function holders_replace($matches){ $placeholder = $matches[2]; if(!isset($this->data[$placeholder])) throw new Exception("No data for placeholder '{{$placeholder}}'"); // process IN({list}) values if(is_array($this->data[$placeholder])){ $data = array(); foreach($this->data[$placeholder] as $v) $data[] = mysqli_real_escape_string($v); $value = implode("', '", $data); } else { $value = mysqli_real_escape_string($this->data[$placeholder]); } return "'{$value}'"; } private function query_process($query, $data){ $this->data = $data; $query = preg_replace_callback("#('?){([^}]+)}(\\1)#sUi", array($this, 'holders_replace'), $query); return $query; } private function result2array(&$query){ $result = array(); $i = 0; if($query === false) { return $result; } while($row = mysqli_fetch_array($query)) { $result[$i] = array(); foreach($row as $key=>$value) { if(!is_numeric($key)) { $result[$i][strtolower($key)] = $value; } } $i++; } return $result; } } Теперь он пишет что нету базы данных. В чем я прогадался? Добавлено спустя 1 минуту 29 секунд: А если у меня все файлы подключены к Index.php ??? Каждый файл имеет if( ! defined( 'GameAmx.ru_Monitoring' ) ) {die( "hacking attempt!" );} Все идет через Index отдельных нету. Можно просто в index прописать это?
в том что ты ТУПО добавил один символ к имени функции не обратив внимание на то как с ней работать надо. например первым аргументом она линк всасывает а у тебя... ну ты понял
Например так Код (PHP): header('Content-Type: text/html; charset=utf-8'); error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE ); ini_set ( 'display_errors', true ); ini_set ( 'html_errors', false ); ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE ); @session_start(); Добавлено спустя 35 секунд: Дошло, спасибо.
Код (PHP): $this->conn = @mysqli_connect($host, $user, $pass) or die("<center><b>No connect Mysql server</b><br></center>"); так делать не хорошо, нужно использовать try - catch конструкцию и под ошибки создать отдельный класс, который будет обрабатывать ошибки. Добавлено спустя 3 минуты 54 секунды: Код (PHP): include ENGINE_DIR .'class.config.db.php'; //Конфиг $db = new database($configdb['db_host'], $configdb['db_user'], $configdb['db_password'], $configdb['db_name']); данная хрень, тоже хрень, откуда берется $configdb, она создается в файле class.config.db.php? это плохо, должно быть так, файл должен заканчиваться return, примерно как то так: Код (PHP): $temp = array( 'db_host' => '', 'db_user' => '', 'db_password' => '', 'db_name' => '' ); return $temp; а потом просто: Код (PHP): $configdb = include ENGINE_DIR .'class.config.db.php'; include в данном случае вернет массив, короче то, что будет возвращать return в файле.
Вот содержание config Код (Text): if( ! defined( 'GameAmx.ru_Monitoring' ) ) {die( "hacking attempt!" );} $configdb = array( 'db_host' => 'localhost', //Адрес mysql 'db_user' => 'root', //Пользователь 'db_password' => '3453', //Пароль mysql 'db_name' => '345345' //Название базы данных ); Что не так? Почему нельзя так делать? if( ! defined( 'GameAmx.ru_Monitoring' ) ) {die( "hacking attempt!" );} Не даст вызвать файл из глобальной области Добавлено спустя 1 минуту 43 секунды: $configdb = include ENGINE_DIR .'class.config.db.php'; Я так понимаю задействует include только к скрипту, который вызывает $configdb ?
почему нельзя, можно, но плохо, чисто с точки зрения.. хз какой, так тебе надо будет каждый раз заглядывать в этот файл - class.config.db.php да бы знать как именно называется переменная, ну потому что не зная как она называется ей не воспользоваться, а в моем примере тебе не надо волноваться за то, как она называется, тебе просто надо будет знать что данный файл возвращает. Это может показаться мелочью, но со временем, с практикой и с увеличение объемов кода, это уже станет головной болью. Добавлено спустя 1 минуту 30 секунд: если у тебя в конце файла стоит стоит return что то, то include будет возвращать этот что то, а не что он там должен (удалось / не удалось).
Я новичок. Делаю все как описано в мануале php, по примерам. Для удобства добавляю функции и прочие, что знаю. В php есть много нюансов, о которых я не знаю. Узнаю со временем. Но некоторые не поддаются моей логике видимо. И прочитать (Как можно сделать а как хрень) у меня не получается. Ведь если код работает, так как я новичок, мне сложно понять, а можно ли так делать? Добавлено спустя 1 минуту 24 секунды: Теперь я понял, спасибо за совет. Что касается Код (Text): $this->conn = @mysqli_connect($host, $user, $pass) or die("<center><b>No connect Mysql server</b><br></center>"); Что тут не так? Добавлено спустя 4 минуты 55 секунд: Кстате, спасибо огромное за подсказку с включением ошибок. Только подрубил в index. Как тут же весь мой код полетел. Вылезло куча ошибок с устаревшими функциями. Буду исправлять
Я изучал РНР по вроде как толковой книге, по отзывам, но там очень много было не правильно, в смысле в логике использования, не знаю, есть ли нормальные книги где бы описывалось по мимо как и что, как правильно писать, концепции, подходы, а как не стоит, что бы например было описано MVC, я столько мучался, пока сочинял свою схему взаимодействия всего со всем и почти придумал MVC ну представь что ты решишь сделать красивый вывод ошибок, в отдельном шаблоне или же производить по мимо вывода ошибок запись их в файл, что тогда? переписывать кучу кода? надо сделать функцию которая будет за это отвечать и решать, делать die или нет, что то типа Код (PHP): function error_controller($place, $message, $critical = true) { echo "<h3>Eror!</h3>"; echo "<div>{$message}</div>"; if ($critical) // ну может будут случае когда не стоит умирать :) { die(); } } $this->conn = @mysqli_connect($host, $user, $pass) or error_controller('db.php', 'No connect Mysql server'); а потом вдруг решишь записывать все в файл и тогда легким движение надо будет дополнить всего одну функцию, а не переписывать уйму кода. Добавлено спустя 5 минут 33 секунды: т.е. если просто die, оно ограничивает действия, если ты вдруг решишь их расширить, то тебе надо будет переписывать кучу кода
Ууууууу. Да вы батенька гурман У каждого свой подход) Есть много решений и удобств Добавлено спустя 2 минуты 57 секунд: Кстате твоя функция хороша тем, что сразу можно понять в каком файле ошибка))) Спасибо, заюзаю)
подход? может быть, но то что было до этого это не правильно, даже примитивно. Ну а за приметив много не платят и не ценят и создаются такие темы - viewtopic.php?f=13&t=49006 кстати, опять же я не совсем правильно написал, вот так будет правильнее: Код (PHP): function error_controller(Exception $exception, $critical = true, $default_value = NULL) // Exception $exception - заставит что бы данный параметр был только объект класса Exception { echo "<h3>Error!</h3>"; echo "<div>message: ". $exception->getMessage() ."</div>"; echo '<div>file: '. $exception->getFile() .'</div>'; // и дальше смотри все методы класса Exception, там и номер строки будет писать и еще много чего if ($critical) // ну может будут случае когда не стоит умирать :) { die(); } return $default_value; } кода больше, но и возможностей и информации больше: Код (PHP): $this->conn = @mysqli_connect($host, $user, $pass) or false; if ($this->conn === false) { $e = new Exception('No connect Mysql server', 911); error_controller($e); } в принципе можно и еще укоротить, но я уже не буду
Так, созрел еще вопрос. Начал заменять устаревшие функции. Возникла ошибка. Код (PHP): $this->template = preg_replace( "#\\{file=['\"](.+?)['\"]\\}#ies","\$this->sub_load_template('\\1')", $this->template); //Заменил на $this->template = preg_replace_callback( "#\\{file=['\"](.+?)['\"]\\}#ies","\$this->sub_load_template('\\1')", $this->template); Работать перестало. Код работал так. Искал в {file=""} Имя файлы. Например {file="index.tpl"} Далее выполнял $this->sub_load_template('\\1') Подставил в место 1 имя файла. $this->template это вывод всего содержимого, для поиска. В Регулярках я бум бум. Хотя и читал много. Так и не дошло понял принцип работы.
найди видео на youtube.com: PHP: Регулярные выражения(Урок 21) Javascript-джедай #28 - Регулярные выражения процентов на 70% все станет ясно, ну а дальше шпаргалку в помощь найдешь.
а можно ссылку на статью где написано что именно так пользоваться данной функцией? миллион других работающих примеров видел а вот такую штуку впервые. и не удивлен что она не работает. она похоже на тупую замену прег_реплейса с модификатором е на прег_реплейс_колбек без модификатора е.
То есть примерно так? Код (PHP): function load($z) { $this->sub_load_template($z); } $this->template = preg_replace_callback( "#\{file=\"(.*)\"}#ie","load", $this->template);