+ Ответить в теме
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Часто встречающиеся ошибки

  1. #1
    Супер-модератор Apay как роза среди колючек Apay как роза среди колючек Apay как роза среди колючек Apay как роза среди колючек Аватар для Apay
    Регистрация
    04.02.2008
    Сообщений
    3,458
    Thanks
    4
    Thanked 511 Times in 506 Posts

    Часто встречающиеся ошибки

    Огромная просьба в этой теме не мусорить, аккуратно и точно указывать на часто встречающиеся ошибки и правильные варианты.

    Очень часто встречается ошибка при выборке данных из базы, она есть в учебнике некоего Попова.
    Для выборки из базы люди используют цикл do-while вместо while, например
    $result = mysql_query( 'SELECT * FROM table WHERE enabled=1' );
    $row = mysql_fetch_array( $result );
    do{
    echo '<p>Data: '.$row['data'].'</p>';
    }while( $row = mysql_fetch_array( $result ) );
    в корне неверно, надо
    $result = mysql_query( 'SELECT * FROM table WHERE enabled=1' );
    while( $row = mysql_fetch_array( $result ) ){
    echo '<p>Data: '.$row['data'].'</p>';
    }
    У первого варианта проверка условия идет после выполнения цикла, у второго - перед. То есть если sql запрос вернет ноль строк, то в первом варианте цикл все равно выполнится, чего в принципе быть не должно.
    Последний раз редактировалось Apay; 23.12.2009 в 14:36. Причина: очепятки
    чаще всего пишу в спешке, могут быть очепятки

  2. #2
    Супер-модератор Apay как роза среди колючек Apay как роза среди колючек Apay как роза среди колючек Apay как роза среди колючек Аватар для Apay
    Регистрация
    04.02.2008
    Сообщений
    3,458
    Thanks
    4
    Thanked 511 Times in 506 Posts
    Заголовки
    --
    Многие начинающие допускают следующую ошибку в применении функций, работающих с заголовками (такиих как setcookie, header): функия вызывается после того как был осуществлен вывод.

    Выводом является результат работы echo, print, любой текст (включая пробелы, перевод строки, заголовки BOM в utf-8) вне <?php и ?>.

    приведу пару примеров неверных и верных решений (способов верного решения очень много, я приведу только по одному)

    пример 1
    неверно
    файл index.php
    <?php
    include( 'header.php' );
    ...
    setcookie( $name, $value );
    ...
    ?>
    файл header.php
    <!DOCTYPE ...> 
    <html...
    ...
    <?php
    ...
    ?>
    решение
    <?php
    ob_start();
    include( 'header.php' );
    ...
    setcookie( $name, $value );
    header( ... );
    ...
    ob_end_flush();
    ?>
    пример 2 (обработчик формы)
    неверно
    <!DOCTYPE ...> 
    <html...
    ...
    <?php
    if( empty($_POST['name']) ){
    echo 'Вы не ввели имя, заполните форму заново<br /><a href="form.html">Перейти к форме</a>';
    header( 'Refresh: 10; url=form.html' );
    }
    ...
    ?>
    ...
    </html>
    решение
    <?php
    $output = '';
    if( empty($_POST['name']) ){
    $output = 'Вы не ввели имя, заполните форму заново<br /><a href="form.html">Перейти к форме</a>';
    header( 'Refresh: 10; url=form.html' );
    }
    ...
    ?><!DOCTYPE ...>
    <html...
    ...
    <?php echo $output; ?>
    ...
    </html>
    Последний раз редактировалось Apay; 24.01.2010 в 20:00. Причина: очепятки

  3. The Following User Says Thank You to Apay For This Useful Post:

    Flok (09.08.2010)

  4. #3
    Местный ZhukV на пути к лучшему Аватар для ZhukV
    Регистрация
    19.12.2009
    Адрес
    Lutsk, Volyns'Ka Oblast', Ukraine, Ukraine
    Сообщений
    1,835
    Thanks
    30
    Thanked 237 Times in 226 Posts
    Записей в дневнике
    3
    Часто втречаются ошибки при выводе кареток (перевод на другую строку)
    Если указать каретку (\r\n) в одинарных кавычках, действия не будет никакого!!! Нужно обезательн в двойных!!!
    ПРИМЕР:

    $text='ZhukV\r\n';//НЕВЕРНО
    $text="ZhukV\r\n";//ВЕРНО


    Также чато есть, когда хотят включить в текстувую переменную элемент массива. В таком случае нужно эелемнет включить либо в фигур скобки либо через сцепление текста.
    ПРИМЕР

    $array['ZhukV']='ZhukV';
    $text="text -- $array['ZhukV']";НЕВЕРНО
    $text="text -- ".$array['ZhukV'];ВЕРНО
    $text="text -- {$array['ZhukV']}";ВЕРНО


    Также заметил, что очень часто встречаются ошибки при инклюд файла. Лучше сначала проверить его наявность, а аж потом подключать:

    $inc_file='inc/zhukv.php';
    if(is_file($inc_file))include($inc_file);
    else echo 'not_file';

  5. #4
    Местный Zippovich за этого человека можно гордится Zippovich за этого человека можно гордится Zippovich за этого человека можно гордится Zippovich за этого человека можно гордится Zippovich за этого человека можно гордится Zippovich за этого человека можно гордится Zippovich за этого человека можно гордится Zippovich за этого человека можно гордится Zippovich за этого человека можно гордится Zippovich за этого человека можно гордится Аватар для Zippovich
    Регистрация
    10.12.2008
    Адрес
    Харьков
    Сообщений
    1,745
    Thanks
    16
    Thanked 144 Times in 144 Posts
    Еще про перевод строки.
    Перевод строки в разных ОС разный:

    1. Windows, MacOS:
    \r\n

    2. Unix, MacOS X:
    \n

  6. #5
    Местный ZhukV на пути к лучшему Аватар для ZhukV
    Регистрация
    19.12.2009
    Адрес
    Lutsk, Volyns'Ka Oblast', Ukraine, Ukraine
    Сообщений
    1,835
    Thanks
    30
    Thanked 237 Times in 226 Posts
    Записей в дневнике
    3
    Очень часто приходится проверять данные. Вот к примеру оброботчика форм, на истинность веденных даных.
    Шаря по инету, и по своей практике, заметил в этом одну КОНЧЕНУЮ ошибку начинающего програмера.
    Вот к примеру проверка поля формы (метод передачи $_GET) с именем name

    if(isset($_GET['name'])){
    ....
    }

    Либо при выборке с базы

    $sql="SELECT * FROM table";
    $ires=mysql_query($ires);
    $ires_result=mysql_fetch_array($ires);
    if(isset($ires_result)){
    ....
    }

    И вот в этом есть некая ошибка начинающего програмера, а особенно в функции isset()
    Ошибка в том, что функция проверит, есть ли переменная в ядре PHP. Проверяет только переменную, а не ее значение.. С этого можна сказать, что если переменная имеет нулевое значение, isset() все равно вернет true

    Значение переменной лучше всего проверять при помощи empty()
    Вернет true если переменная значение не имеет, в противном случае false


    if(!empty($_GET['name'])){
    ....//если имеется переменная и имеет значение кроме нуля
    }

  7. #6
    Местный alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее Аватар для alexdrob
    Регистрация
    08.09.2009
    Адрес
    Краснодарский край
    Сообщений
    6,487
    Thanks
    39
    Thanked 1,096 Times in 1,066 Posts
    Цитата Сообщение от ZhukV Посмотреть сообщение
    Вот к примеру проверка поля формы
    С другой стороны ошибка бывает как раз наоборот с использованием empty
    Например передают значение 0 в какой либо форме или в списке select есть значение 0 его передать надо
    что то типа
    <select>
    <option valeu="0"></option>
    <option valeu="1"></option>
    ...
    </select>

    Если выбрать первое в списке то empty не пропустит переменную...

  8. #7
    Модератор Mulder - весьма и весьма положительная личность Mulder - весьма и весьма положительная личность Mulder - весьма и весьма положительная личность Аватар для Mulder
    Регистрация
    19.05.2010
    Адрес
    Гомель
    Сообщений
    1,691
    Thanks
    13
    Thanked 179 Times in 169 Posts
    Часто встречающаяся ошибка: средствами пхп производить разбор и вычисления данных из баз данных. Золотое правило: операции над данными, принадлежащие бд, нужно производить самой бд. Бд организует и хранит данные специальным образом, только она знает, как наиболее оптимально и быстро произвести запрошенные операции. В идеале вы должны использовать только функции парсинга результатов работы бд - mysql_fetch_*().
    Распространенные ошибки.
    Подсчет числа строк:
    неверно:
    $result = mysql_query("SELECT * FROM `table`");
    $count = mysql_num_rows($result);

    верно:
    $result = mysql_query("SELECT COUNT(*) AS `count` FROM `table`");
    $data = mysql_fetch_assoc($result);
    $count = $data['count'];


    Подсчет числа символов в поле (данные типа varchar или text):
    неверно:
    $result = mysql_query("SELECT `text` FROM `table` WHERE `id` = 1"); 
    $data = mysql_fetch_assoc($result);
    $count = strlen($data['text']);

    верно:
    $result = mysql_query("SELECT CHAR_LENGTH(`text`) FROM `table` WHERE `id` = 1");
    $data = mysql_fetch_assoc($result);
    $count = $data[0];

    Определение разницы даты (текущей и датой из таблицы):
    неверно:
    $result = mysql_query("SELECT `date` FROM `table` WHERE `id` = 1");
    $data = mysql_fetch_assoc($result);
    $date = $data['date'];
    // функции php по определению разницы дат
    ...

    верно:
    $result = mysql_query("SELECT DATEDIFF(NOW(), `date`) FROM `table` WHERE `id` = 1");
    $data = mysql_fetch_assoc($result);
    $date = $data[0];


    и т.д.

  9. #8
    Супер-модератор Apay как роза среди колючек Apay как роза среди колючек Apay как роза среди колючек Apay как роза среди колючек Аватар для Apay
    Регистрация
    04.02.2008
    Сообщений
    3,458
    Thanks
    4
    Thanked 511 Times in 506 Posts
    Цитата Сообщение от ZhukV Посмотреть сообщение
    Либо при выборке с базы
    При выборке с базы при проверке использовать:
    $result = mysql_query( ... );
    if( $result === false ){
    // ERROR!!!
    }
    else{
    // do something
    }
    т.к. mysql_query при ошибке почти всегда возвращает false
    Последний раз редактировалось Apay; 11.01.2011 в 09:53.
    чаще всего пишу в спешке, могут быть очепятки

  10. #9
    Пользователь zBool на пути к лучшему Аватар для zBool
    Регистрация
    06.12.2010
    Сообщений
    47
    Thanks
    8
    Thanked 4 Times in 4 Posts
    Очень распространенная ошибка в разработке разных видов каптч.

    <?php
    if ($_POST['captcha'] != $_SESSION['captcha'])
    echo 'не правильно';
    else
    echo ' правильно';
    ?>

    Обходится легко, отключаете Cookies, из исх кода(если опера) удаляете <input type="text" name="captcha" ..... />
    и отправляете запрос, тогда $_POST['captcha'] равна NULL и $_SESSION['captcha'] равна NULL, получается — условие выполнено, "катпча введена верно.".
    решение:
    <?php
    if ($_POST['captcha'] != $_SESSION['captcha'] || !isset($_POST['captcha']) )
    echo 'не правильно';
    else
    echo ' правильно';
    ?>

  11. #10
    Модератор Mulder - весьма и весьма положительная личность Mulder - весьма и весьма положительная личность Mulder - весьма и весьма положительная личность Аватар для Mulder
    Регистрация
    19.05.2010
    Адрес
    Гомель
    Сообщений
    1,691
    Thanks
    13
    Thanked 179 Times in 169 Posts
    Цитата Сообщение от zBool Посмотреть сообщение
    Очень распространенная ошибка в разработке разных видов каптч.
    Вообще-то, при сравнении возможно неинициализированных данных пишут так:
    if (isset($_POST['a']) && $_POST['a'] == $b)

    Человек, говорящий, что это невозможно сделать, не должен мешать тому, кто это делает.
    Brainbench.com - PHP5: 4.03 out of 5. Master degree.
    Oracle Certified Java Programmer (SCJP) SE 5.

+ Ответить в теме

Похожие темы

  1. Часто обновляемый DNS
    от Alcorn в разделе Доменные имена
    Ответов: 11
    Последнее сообщение: 17.11.2009, 07:03
  2. Ответов: 0
    Последнее сообщение: 08.05.2009, 15:16
  3. встречайте search.wikia.com
    от Nightfly в разделе Поисковые системы
    Ответов: 0
    Последнее сообщение: 27.11.2008, 01:03
  4. Ответов: 0
    Последнее сообщение: 05.09.2008, 18:15

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения

 

Html-форум RATING ALL.BY Рейтинг@Mail.ru