PHP 5.4.36 Released

Използване на PHP

Тук са показани и обяснени много основни грешки, с които може да се сблъскате докато пишете PHP скриптове.

  1. Бих желал да напиша PHP скрипт, които да обработва данни идващи от формуляр. Как бих могъл да знам кои променливи предадени с метода POST са достъпни?
  2. Трябва да преобразувам всички единични кавички (') в обратно наклонени черти (\) последвани от единични кавички (\'). Как мога да направя това с регулярен израз? Също така искам да превърна " в \" и \ в \\.
  3. Всички двоични кавички (") станаха \" и всички единични кавички (') станаха \', как мога да премахна нежеланите обратно наклонени черти (\)? И защо изобщо са се появили?
  4. Когато направя следното, не получавам желаният резултат: <?phpfunction myfunc($argument){    echo $argument + 10;}$variable = 10;echo "myfunc($variable) = " . myfunc($variable);?> Защо се случва така?
  5. Защо не се появяват на отделен ред? <pre><?php echo "This should be the first line."; ?><?php echo "This should show up after the new line above."; ?></pre>
  6. Получавам съобщение 'Warning: Cannot send session cookie - headers already sent...' или 'Cannot add header information - headers already sent...'.
  7. Трябва да взема информация от заглавките директно. Как мога да го направя?
  8. Когато се опитам да извърша удостоверяване на самоличност с IIS получавам 'No Input file specified'.
  9. Windows: Не мога да получа достъп на споделените файлове от друг компютър ползващ IIS
  10. PHP скиптовете ми работят на IE и Lynx, но не и на Netscape. Когато дам на "View Source" мога да видя кода под IE, но не и под Netscape.
  11. Как мога да използвам XML и PHP? Дава ми грешка заради моите <?xml тагове!
  12. How can I use PHP with FrontPage or some other HTML editor that insists on moving my code around?
  13. Къде мога на намеря списък от променливите, които мога да използвам в PHP?
  14. Как мога да създам (генерирам) PDF файл без да използвам платените и комерсиални библиотеки ClibPDF и PDFLib? Бих желал нещо което е безплатно и не изисква външни PDF библиотеки.
  15. Опитвам се да използвам някои от стандартните CGI променливи (като $DOCUMENT_ROOT или $HTTP_REFERER) в моя функция и изглежда нямам достъп до тях. Какво не е наред?
  16. Някои PHP директиви могат да приемат кратки байтови стойности, за разлика от тези, които приемат само цели числа. Кои са достъпните възможности за кратки байтови стойности? Мога ли да ги използвам извън php.ini?
  17. How does the PHP directive register_globals affect me?

Бих желал да напиша PHP скрипт, които да обработва данни идващи от формуляр. Как бих могъл да знам кои променливи предадени с метода POST са достъпни?

PHP разполага с много предварително-дефинирани променливи, като супер глобалният масив $_POST. Може да обходите масива $_POST използвайки цикъл, тъй като той представлява асоциативен масив съдържащ всички променливи предадени с метода POST. Например, нека да използваме цикъла foreach, да търсим за празни променливи и да ги изкарваме на екрана.

<?php
$empty 
$post = array();
foreach (
$_POST as $varname => $varvalue) {
    if (empty(
$varvalue)) {
        
$empty[$varname] = $varvalue;
    } else {
        
$post[$varname] = $varvalue;
    }
}

print 
"<pre>";
if (empty(
$empty)) {
    print 
"None of the POSTed values are empty, posted:\n";
    
var_dump($post);
} else {
    print 
"We have " count($empty) . " empty values\n";
    print 
"Posted:\n"var_dump($post);
    print 
"Empty:\n";  var_dump($empty);
    exit;
}
?>

Забележка: Superglobals: availability note
От PHP 4.1.0, superglobal масивите като $_GET , $_POST, и $_SERVER, и т.н. са достъпни. За повече информация, прочетете раздела от ръководството в superglobals

Трябва да преобразувам всички единични кавички (') в обратно наклонени черти (\) последвани от единични кавички (\'). Как мога да направя това с регулярен израз? Също така искам да превърна " в \" и \ в \\.

PHP разполага с няколко много полезни функции за тази цел. Първата от тях е функцията addslashes(). Вижте също и mysql_escape_string(). Също така може да премахвате обратно наклонени черти с функцията stripslashes().

Забележка: пояснение за директива: magic_quotes_gpc
PHP директивата magic_quotes_gpc по подразбиране има стойност on. По същество това изпълнява addslashes() (добавяне на обратно-наклонени черти) върху всички данни от тип GET, POST и COOKIE. stripslashes() може да бъде използвана за премахването им.

Всички двоични кавички (") станаха \" и всички единични кавички (') станаха \', как мога да премахна нежеланите обратно наклонени черти (\)? И защо изобщо са се появили?

PHP функцията stripslashes() ще премахне обратно наклонените черти от вашия string. В повечето случаи кавичките ще се появят автоматично когато директивата magic_quotes_gpc е включена.

Забележка: пояснение за директива: magic_quotes_gpc
PHP директивата magic_quotes_gpc по подразбиране има стойност on. По същество това изпълнява addslashes() (добавяне на обратно-наклонени черти) върху всички данни от тип GET, POST и COOKIE. stripslashes() може да бъде използвана за премахването им.

Когато направя следното, не получавам желаният резултат:

<?php
function myfunc($argument)
{
    echo 
$argument 10;
}
$variable 10;
echo 
"myfunc($variable) = " myfunc($variable);
?>

Защо се случва така?

За да може да използвате резултати от функциите в израз (както например слепване на низове, като примера по-горе), трябва да върнете стойността с return(), вместо да я извеждате с echo().

Защо не се появяват на отделен ред?

<pre>
<?php echo "This should be the first line."?>
<?php 
echo "This should show up after the new line above."?>
</pre>

В PHP, завършването на блок от код е или "?>" или "?>\n" (където \n означава нов ред). Така че в примера показан по-горе изреченията ще бъдат на една линия, защото PHP пропуска новите редове след края на блока. Това значи, че трябва да се добави допълнителен нов ред след всеки блок от PHP код, за да може да се показват на отделен ред.

Защо PHP прави това? Защото, когато форматирате нормален HTML, това улеснява нещата, защото може да не искате този нов ред, но ще трябва да създавате изключително дълги редове от код; вашият код ще стане абсолютно не четим.

Получавам съобщение 'Warning: Cannot send session cookie - headers already sent...' или 'Cannot add header information - headers already sent...'.

Функциите header(), setcookie() и сесиините функции служат за добавяне на заглавки към отговора на сървъра, но това може да стане преди да се изпрати какъвто и да е текст. Преди употребата на тези функции не трябва да има никакъв върнат изход, като например HTML код. headers_sent() ще провери дали вашият скрипт е изпратил заглавките. Вижте също функциите за управление на изхода.

Трябва да взема информация от заглавките директно. Как мога да го направя?

Функцията getallheaders() ще свърши това ако използвате PHP като модул към Apache. Следният код ще ви покаже как може да прочетете заглавките:

<?php
$headers 
getallheaders();
foreach (
$headers as $name => $content) {
    echo 
"headers[$name] = $content<br />\n";
}
?>

Вж. също apache_lookup_uri(), apache_response_headers() и fsockopen()

Когато се опитам да извърша удостоверяване на самоличност с IIS получавам 'No Input file specified'.

Моделът за сигурност на IIS изисква това. Това е също така е проблем на всички CGI програми работещи под IIS. Решението на проблема се състои в това да се създаде HTML файл (независим от PHP) като начална страница на директорията към която се извършва удостоверяването на самоличност. След това може да използвате META таг за да пренасочите клиента към PHP страницата, или да използвате връзка към PHP страницата. След това PHP ще разпознае удостоверяването на самоличност правилно. Ако използвате ISAPI модула, това няма да е проблем. Това няма да повлиае на други NT уеб сървъри. За повече информация вижте: » http://support.microsoft.com/kb/q160422/ и HTTP удостоверяване на самоличност.

Windows: Не мога да получа достъп на споделените файлове от друг компютър ползващ IIS

Трябва да смените Go to Internet Information Services. Намерете вашият PHP файл и вижте неговите аксесоари. Отидете на File Security таба, и Edit -< Anonymous access and authentication control.

Може да решите този проблем по два начина: да изключите Anonymous Access и да оставите Integrated Window Authentication включено, или, да включите Anonymous Access и да проверите правата на потребителя, тъй като може да не са нагалсени правилно.

PHP скиптовете ми работят на IE и Lynx, но не и на Netscape. Когато дам на "View Source" мога да видя кода под IE, но не и под Netscape.

Netscape е много по-стриктен по отношение на HTML таговете (например таблици) отколкото IE. Проверете HTML кода си с HTML валидатор, например » validator.w3.org, може да бъде много полезен. Например, липсващ таг </table> може да причини това.

Също така IE и Lynx игнорират всички нули (\0) в HTML потока, за разлика от Netscape. Най-добрият начин да проверите това е да компилирате командната версия на PHP (още известна като CGI) и да пуснете скрипта от командния ред. Под *nix, свържете го с od -c и потърсете за знаци \0. Ако използвате Windows, трябва да си набавите програма, която ви позволява да виждате двоичния код на дадена програма. Когато Netscape срещне NUL в даден файл не показва нищо като отговор, а IE и Lynx ще игнорорат NUL знака.

Как мога да използвам XML и PHP? Дава ми грешка заради моите <?xml тагове!

За да може да включите <?xml тагове в вашият PHP код, трябва да изключите кратките тагове чрез PHP директива. short_open_tags трябва да е 0. Не може да използвате директивата с функцията ini_set(). Независимо дали short_open_tags е включена или не, може да използвате: <?php echo '<?xml'; ?>. На повечето сървъри директивата е включена.

How can I use PHP with FrontPage or some other HTML editor that insists on moving my code around?

Един от най-лесните начини да направите това е да позволите използването на ASP тагове в PHP кода. Това ви позволява да използвате разделитете за код <% и %> в ASP-стил. Някои от най-популярните HTML редактори се справят по-добре с това (за сега). За да позволите тагове в ASP стил, трябва да включите asp_tags php.ini променливата или да използвате подходяща Apache директива.

Къде мога на намеря списък от променливите, които мога да използвам в PHP?

Прочетете указанието за работа с предварително-дефинирани променливи, където е включен и списък с всички предварително-дефинирани променливи, които може да използвате във вашия PHP скрипт. Списък с абсолютно всички променливи (и доста повече информация) може да видите като използвате функцията phpinfo(). Бъдете сигурни, че сте прочели указанието за работа с външни PHP променливи, където е указано как да използвате външни променливи, като данни от HTML формуляр, бисквитки и URL адреси.

Забележка: register_globals: важно пояснение
От PHP 4.2.0, стойността по подразбиране на PHP директивата register_globals е off и е изцяло премахната в PHP 6.0.0. PHP общността ви насърчава да не разчитате на тази директива, а вместо това да използвате други средства, като superglobals.

Как мога да създам (генерирам) PDF файл без да използвам платените и комерсиални библиотеки ClibPDF и PDFLib? Бих желал нещо което е безплатно и не изисква външни PDF библиотеки.

Има няколко алтарнативи написани на PHP, като » http://www.ros.co.nz/pdf/, » http://www.fpdf.org/, » http://www.gnuvox.com/pdf4php/ и » http://www.potentialtech.com/ppl.php. Също така съществува » Panda модула.

Опитвам се да използвам някои от стандартните CGI променливи (като $DOCUMENT_ROOT или $HTTP_REFERER) в моя функция и изглежда нямам достъп до тях. Какво не е наред?

Много е важно да се отбележи, че PHP директивата register_globals влияе както на сървърните променливи така и на тези принадлежащи на обвивката. В случая когато register_globals = off (стойността по подразбиране от PHP 4.2.0), $DOCUMENT_ROOT няма да съществува. Вместо това може да използвате $_SERVER['DOCUMENT_ROOT'] . Ако register_globals = on и нямате достъп до $DOCUMENT_ROOT когато го използвате във функции, това е защото се използва като всички останали променливи и се нуждае от global $DOCUMENT_ROOT в самата функция. Също така може да погледнете: област на действие на променливи. Препоръчително е да пишете скриптове си с register_globals = off.

Забележка: Superglobals: availability note
От PHP 4.1.0, superglobal масивите като $_GET , $_POST, и $_SERVER, и т.н. са достъпни. За повече информация, прочетете раздела от ръководството в superglobals

Някои PHP директиви могат да приемат кратки байтови стойности, за разлика от тези, които приемат само цели числа. Кои са достъпните възможности за кратки байтови стойности? Мога ли да ги използвам извън php.ini?

Възможните опции са K ( за Килобайтове), M (за Мегабайтове) и G (за Гигабайтове; може да се използва от PHP 5.1.0). Всяка останала опция се приема за байтове. 1M е Мегабайт или 1048576 байта. 1K е Килобайт или 1024 байта. Не може да използвате тези кратки нотации извън php.ini, като вместо тях можете да използвате целочислена стойност за байтовете. Вижте документацията на функция ini_get() за да видите пример за преобразуването на тези стойности.

How does the PHP directive register_globals affect me?

First, an explanation about what this ini setting does. Let's say the following URL is used: http://example.com/foo.php?animal=cat and in foo.php we might have the following PHP code:

<?php
// Using $_GET here is preferred
echo $_GET['animal'];

// For $animal to exist, register_globals must be on
// DO NOT DO THIS
echo $animal;

// This applies to all variables, so $_SERVER too
echo $_SERVER['PHP_SELF'];

// Again, for $PHP_SELF to exist, register_globals must be on
// DO NOT DO THIS
echo $PHP_SELF;
?>

The code above demonstrates how register_globals creates a lot of variables. For years this type of coding has been frowned upon, and for years it's been disabled by default. Note that PHP 6 removes this deprecated feature. So although most web hosts disable register_globals, there are still outdated articles, tutorials, and books that require it to be on. Plan accordingly.

See also the following resources for additional information:

Забележка: In the example above, we used an URL that contained a QUERY_STRING. Passing information like this is done through a GET HTTP Request, so this is why the superglobal $_GET was used.

add a note add a note

User Contributed Notes 3 notes

up
2
greenie2600 at yahoo dot com
7 years ago
Here's a simple function that will convert the shorthand values described in point 64.16 to a number of bytes.

I use this to display the maximum size of file uploads to the user, so they don't waste time uploading a huge file only to find that it's too big. (I've been unable to find any browsers that actually support the MAX_FILE_SIZE technique described in chapter 38, and it's certainly not part of any W3C spec, so this is the next best thing.)

Here's how you'd use my function for that purpose (though you might want to abstract this to a function of its own):

<?php
echo 'Maximum file size: ' . convertBytes( ini_get( 'upload_max_filesize' ) ) / 1048576 . 'MB';
?>

And here's the function:

<?php
/**
* Convert a shorthand byte value from a PHP configuration directive to an integer value
* @param    string   $value
* @return   int
*/
function convertBytes( $value ) {
    if (
is_numeric( $value ) ) {
        return
$value;
    } else {
       
$value_length = strlen( $value );
       
$qty = substr( $value, 0, $value_length - 1 );
       
$unit = strtolower( substr( $value, $value_length - 1 ) );
        switch (
$unit ) {
            case
'k':
               
$qty *= 1024;
                break;
            case
'm':
               
$qty *= 1048576;
                break;
            case
'g':
               
$qty *= 1073741824;
                break;
        }
        return
$qty;
    }
}
?>
up
2
kjn
7 years ago
64.16 Byte Values

The number that precedes K, M, or G should be an integer.

E.g. this php.ini directive:
   post_max_size = 0.25M
is interpreted as 0, and thus prevents all POSTs.

It is particularly unhelpful that phpinfo() reports the string value assigned to post_max_size (0.25M), and not the numerical value that PHP extracts from that string (0M).
up
0
info at zankmusic dot com
5 years ago
Just spent a couple days on this one...
As previously posted, if you set
upload_max_filesize = 0.25M, the value reads correctly in phpinfo(), BUT it is effectively ZERO when implemented.

Note that the following also give ZERO bytes:

upload_max_filesize =  10M  (note the two white spaces before 10M), but the phpinfo() reads '10M' and everything looks ok.

I removed all white spaces in my php.ini file and viola...working fine again.
To Top