@damian dot szewczyk, re: post_max_size using K or M notation. My experience has been that, on PHP 5.1.x on a number of different platforms, I can actually specify as high as 10239M but any higher using the M prefix and POST stops working.
Използване на PHP
Тук са показани и обяснени много основни грешки, с които може да се сблъскате докато пишете PHP скриптове.
- Бих желал да напиша PHP скрипт, които да обработва данни идващи от формуляр. Как бих могъл да знам кои променливи предадени с метода POST са достъпни?
- Трябва да преобразувам всички единични кавички (') в обратно наклонени черти (\) последвани от единични кавички (\'). Как мога да направя това с регулярен израз? Също така искам да превърна " в \" и \ в \\.
- Всички двоични кавички (") станаха \" и всички единични кавички (') станаха \', как мога да премахна нежеланите обратно наклонени черти (\)? И защо изобщо са се появили?
- Когато направя следното, не получавам желаният резултат: <?phpfunction myfunc($argument){ echo $argument + 10;}$variable = 10;echo "myfunc($variable) = " . myfunc($variable);?> Защо се случва така?
- Защо не се появяват на отделен ред? <pre><?php echo "This should be the first line."; ?><?php echo "This should show up after the new line above."; ?></pre>
- Получавам съобщение 'Warning: Cannot send session cookie - headers already sent...' или 'Cannot add header information - headers already sent...'.
- Трябва да взема информация от заглавките директно. Как мога да го направя?
- Когато се опитам да извърша удостоверяване на самоличност с IIS получавам 'No Input file specified'.
- Windows: Не мога да получа достъп на споделените файлове от друг компютър ползващ IIS
- PHP скиптовете ми работят на IE и Lynx, но не и на Netscape. Когато дам на "View Source" мога да видя кода под IE, но не и под Netscape.
- Как мога да използвам XML и PHP? Дава ми грешка заради моите <?xml тагове!
- How can I use PHP with FrontPage or some other HTML editor that insists on moving my code around?
- Къде мога на намеря списък от променливите, които мога да използвам в PHP?
- Как мога да създам (генерирам) PDF файл без да използвам платените и комерсиални библиотеки ClibPDF и PDFLib? Бих желал нещо което е безплатно и не изисква външни PDF библиотеки.
- Опитвам се да използвам някои от стандартните CGI променливи (като $DOCUMENT_ROOT или $HTTP_REFERER) в моя функция и изглежда нямам достъп до тях. Какво не е наред?
- Някои PHP директиви могат да приемат кратки байтови стойности, за разлика от тези, които приемат само цели числа. Кои са достъпните възможности за кратки байтови стойности? Мога ли да ги използвам извън php.ini?
-
Бих желал да напиша 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().
Забележка: directive note: magic_quotes_gpc PHP директивата magic_quotes_gpc има стойност по подразбиране on. По същество това изпълнява addslashes() върху всички ваши GET, POST и COOKIE данни. Може да използвате stripslashes() за да ги махнете.
-
Всички двоични кавички (") станаха \" и всички единични кавички (') станаха \', как мога да премахна нежеланите обратно наклонени черти (\)? И защо изобщо са се появили?
-
PHP функцията stripslashes() ще премахне обратно наклонените черти от вашия string. В повечето случаи кавичките ще се появят автоматично когато директивата magic_quotes_gpc е включена.
Забележка: directive note: 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: important noteОт PHP 4.2.0, стойността по подразбиране за register_globals PHP директивата е 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() за да видите пример за преобразуването на тези стойности.
Използване на PHP
23-Jan-2008 07:20
30-Oct-2007 08:47
In the addition to kjn remark.
You can't pass to post_max_size values greater then 2147483647 in the notation with K or M. So the maximum here is 2047M or 2097151K. Greater values are treated like 0 and POST doesn't work.
On the other hand you can provide simple numbers greter then 2147483647 and POST works normally.
10-Oct-2007 07:31
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;
}
}
?>
02-Jul-2007 10:46
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).
This is also a PDF generator (open source)
TCPDF
http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf
19-Jan-2006 09:54
In reference to faq.using:
6. I get the message 'Warning: Cannot send session cookie - headers already sent...' or 'Cannot add header information - headers already sent...'.
This can be caused by starting a session and then calling a class function in a php file that has any whitespace either before the very first or after the very last php tags <?php and ?>.
Make sure there is NO whitespace before the initial tag and after the closing tag.
