Webmaster общности: Predpriemach.com | SearchEngines.bg

    Правилно структуриране на PHP

    php mysql уроци

    Автор: eddyy93

    Здравейте туристи.

    Забелязал съм, че доста от вас ползвате ob_start(); и маскиране на грешките в кодовете. В този урок ще се опитам да ви обясна какво представляват тези 2 метода който ползвате и как да ги избягваме, също така и как да структурираме правилно един код, за да бъде той по четлив и оптимизиран.

    Първо да започнем с какво представлява ob_start();

    • ob_start(); (output buffering) е функция която, чете целият ви написан код и го пренарежда по стандартите. Обаче това си има и своят минус.

    Разгледайте го така: За да ви зареди страница която вие сте избрали и на нея се съдържа тази функция, то първо страницата се зарежда от функцията (1 път), после кода се нарежда (1 пъти) и най-накрая се изпълнява през функцията, тоест един вид страницата ви се презарежда 3 пъти, това означава ли, че функцията ви забавя страниците x3 ? Да, забавя е и то значително при по-големи файлове с повечко код.

    • Пример за ob_start();:
    <?php
    echo 'some text';
    session_start();
    echo 'some more text';

    Този код по стандарт, би ни изкарало грешка от типа: „headers already been sent“.

    Но ако го напишем:

    <?php
    ob_start();
    echo 'some text';
    session_start();
    echo 'some more text';

    Грешка няма да получим, заради това, че функцията ни пренарежда кода, по ето този вариянт (давам като пример да разберете как работи самата функция) :

    <?php
    session_start();
    echo 'some text';
    echo 'some more text';

    Но, за да се получи тази структура, трябва да се изпълни:

    1. Преглед на целият код.
    2. Нареждане на кода.
    3. Показване на готовият за вас вид на кода през функцията.

    Малко по-надолу в урока ще ви обясна защо дава тази грешка с headers и как да е избегнем без ob_start();

    „Скриване на грешки“

    • Скриването на грешки не ви решава проблемите!

    Скриване на грешки от типа:

    error_reporting(0)
    @
    И премахване от php.ini

    Говорят само за един доста на бързо написан и не добре структуриран код, може и в някой моменти да се говори дори и за не добре защитен код.

    • Защо да не премахваме грешките?
      Грешките са тези който в даден момент ти помагат да разрешиш даден проблем, който всъщност не можеш да откриеш в случай, че си стартирал функциите за „маскиране“ на грешки.
    • Забавя ли зареждането на страницата ви?
      И това както и ob_start(); Забавя зареждането на страницата.
    • Как да не пропускаме грешки?

    Като за начало не слагайте функции като error_reporting(0) за маскиране на грешките, защото вие не подобрявате кода, а го забавяте още и грешките са в сила все още.

    „@“ – Маймунското „А“. Предполагам всички знаете, че ви скрива грешки възникнали на даден ред от кода. Как да го избягваме?
    Това става с проверки if .. else

    Пример за взимане на информация от форма:

    if($_POST['submit']) {
    //код
    }

    При този вариянт ако всичко на хоста ви е по „defalut“ (както се нарича), ще получите грешка при първоначално стартиране на кода: Unidentified variable.
    Защото променливата $_POST не се е индентифицира никъде. Обаче при натискане на бутона „submit“ тази грешка, ще ви изчезне, защото вече ще е индентифицирана.

    Сега тази грешка може да бъде маскиране с „@“ ето така:

    if(@$_POST['submit']) {
    //код
    }

    Но, това не ви решава проблема, грешката продължава да е в действие, макар че не се показва.

    Обаче за пълното решение на този проблем, може да ползваме функцията „isset()“, тази функция проверява дали тази променлва е индентифицира и ако не е връща „false“ и проверката минава за невалидна, а не да върне грешка.

    Ето така:

    if(isset($_POST['submit'])) {
    //код
    }

    Разбира се тази функция, може да се ползва и за други променливи (глобални и не глобални).

    Пример за още един вид маскиране с „@“ или с „error_reporting(0)“.
    Е когато изкарвате информация от даден файл. И ако този файл не съществува ви връща грешка.

    Винаги може и на него да се направи проверка от този тип:

    if (file_exists($filename)) {echo 'file exist'}

    Като правило е да описвате всичко което правите. Да проверявате дали дадено нещо съществува дали е индентифицирано, ако дадена функция да кажем не връща стойност, трябва да и зададем нещо като алтернатива в този случай, като пример „null“ стойност.

    Мисля, че до тук разгледахме в общи линии за грешките, и тяхните маскирания като ob_start(); и маскиране на грешките.

    Правилно структуриране на кода, за избягване на грешки и ob_start();

    • Сега разглеждайте един файл да кажем index.php като 2 части.
    1. – ва: PHP кодът (който седи най-отгоре на страницата).
    2. – ра: HTML кодът (който седи надолу в страницата).
    • Когато пишете вашият код смесено като пример:
    <html>
    <head></head>
    <body>
    <h2>Hello</h2>
    <?php
    session_start();
    $_SESSION['smth']='text';
    ?>
    </body>
    </html>

    Това ще ви върне грешка, че „headers already been sent“ – в превод, че имаш вече изпратена сървърна информация към клиента (не съм със сигурност дали това е точното определение).

    Тази грешка се дължи на това, че преди session_start(); Имаш написани тагове или текст. И следователно щом имаш написани тагове или текст, всичко след първият ТАГ или ТЕКСТ не се счита вече за тази „първоначална информация която се праща към клиента“ и когато дойде реда на session_start(); сървъра се опитва да изпрати информация за стартиране на сесии, обаче няма как да се стартират сесиите, тъй като те се водят от този вид „първата информация (сървърната)“ и се връща грешка.

    Сега как да избягваме този вид грешки:

    1. -во: Запомнете, че всички функции свръзани към headers (главните части), се пращат преди всеки таг или текст (тоест те се пишат първи в файла).

    Примера от горе, без никъкви грешки, ще изглежда така:

    <?php session_start(); ?>
    <html>
    <head></head>
    <body>
    <?php
    echo '<h2>Hello</h2>';
    $_SESSION['smth']='text';
    ?>
    </body>
    </html>

    Сега написах „<h2>Hello</h2>“ в PHP и ECHO, какво искам да ви кажа:
    Някой ползват ето този стил на писане:

     

    <?php //kod ?><img src='<?php echo 'some text' ?>' height='<?php echo $width ?>' width='100px' /><?php //kod ?>

    Не казвам, че е лошо. Но просто е нечетливо, и може би това отваряне затваряне на PHP, забавя до някъква степен кода (не съм сигурен за това със забавянето, ! мое предположение !).
    Искам да ви каже, че иматели динамични места като примерно този код за снимки е хубаво целият ред да бъде вкаран в echo.

    1. -ро: Сега едно от важните неща за структуриране на кода е имено това как да разделите PHP от HTML.
    • Като за начало искам да почна с това, че над тага се извършват всички действия който желаете да бъдат извършени с PHP – там няма echo „“ да пускате и други видове показване на текст. Само действията. Самото показване става в ТУК . Като информацията ще е прехвърляте с променливи. Това помага на действия като header(); за препращане и помага за по нагледен код. Също така това, ще бъдат действия който браузера ще зареди първи и от там надолу страницата няма да ви забавя своето отваряне.

    Ето пример за една POST форма за коментари да кажем:

    <?php
    session_start();
    
    if(isset($_POST['submit'])){
    
    $greshka=array();
    if(empty($_POST['name']) || empty($_POST['komentar']))
    {$greshka['1']=true;}
    
    else {
    $inrow=mysql_query("INSERT INTO");
    if($inrow)
    {
    header("Location: index.php");
    exit;
    }
    }
    
    }
    ?>
    <html>
    <head></head>
    <body>
    <form method='post' action='index.php'>
    <br>
    <input type='text' name='name' />
    <br>
    <textarea name='komentar' rows='20' cols='10' ></textarea>
    <br><br>
    <input type='submit' name='submit' value=' SEND ' />
    <br>
    </form>
    <?php if(isset($greshka['1'])) {echo 'Не може да оставяте празни полета';} ?>
    </body>
    </html>
    

    Ето как изпълних този код:
    В началото на файла проверявам дали формата е изпратена ако е изпратена, проверявам дали полетата са празни ако не са – записвам в базата данни и препращам към index.php (тоест към същият файл). Сега ако са празни полетата, не слагам echo веднага ами го вкарвам в променлива или в масив ако са повече грешки и го зареждам долу под формата.
    Написал съм и също в началото един session_start(); – в този момент не ми трябва, но искам да ви покажа къде трябва да му е мястото.

    Разбира се ако дори напишете всичко след (заедо с него) в едно „echo“, няма да се счита за грешка. Избягвайте само постоянното отваряне и затваряне на „<?php“ „?>“.

    Мисля, че е това е достатъчно. Оставяйте коментари, сигнализирайте ако имам грешки и се надявам да съм помогнал на поне някого.