PHP 7.1.18 Released

PHP и HTML

PHP и HTML си взаимодействат активно PHP може да генерира HTML и HTML може да предава информация към PHP. Преди да прочетете това ръководство е много важно да знаете как да предавате информация към PHP. Също така, тук са включени много примери. Обърнете внимание към това какво е register_globals.

  1. Какво кодиране/декодиране трябва да използвам, за да изпратя информация чрез формуляр/URL?
  2. Опитвам да използвам <input type="image"> таг, но $foo.x и $foo.y променливите не съществуват. $_GET['foo.x'] не съществува също. Къде са те и как да получа достъп до тях?
  3. Как да създавам масиви в HTML <form>?
  4. Как мога да взема резултатите от select с множествен избор в HTML?
  5. Как да предам променлива от Javascriopt към PHP?

Какво кодиране/декодиране трябва да използвам, за да изпратя информация чрез формуляр/URL?

Има няколко етапа, за които кодирането е от изключително значение. Да приемем, че имате низ $data, съдържащ низа, които вие искате да изпратите в не кодиран вид. Ето съответните етапи:

  • HTML интерпретиране. За да установите низ, вие трябва да го вмъкнете в двойни кавички и да го предадете като параметър на функция htmlspecialchars().

  • URL: състои се от няколко части. Ако искате данните ви да се интерпретират като едно цяло, трябва да ги кодирате с функцията urlencode().

Example #1 Елементът hidden от HTML формуляр

<?php
    
echo "<input type='hidden' value='" htmlspecialchars($data) . "' />\n";
?>

Забележка: Ггрешка ще е да използвате функцията urlencode() за $data, защото браузърът предварително е кодирал данните. Всички добре известни браузъри правят това. Забележете, че това ще стане независимо от метода които използвате (GET или POST). Ще забележите това само в случай, че използвате метода GET, защото обикновенно POST заявките остават скрити.

Example #2 Информация добавена от клиента

<?php
    
echo "<textarea name='mydata'>\n";
    echo 
htmlspecialchars($data)."\n";
    echo 
"</textarea>";
?>

Забележка: Данните ще бъдат показани в браузъра по начина по които са въведени, защото браузъра ще интерпретира HTML екранираните символи. При предаването на данните чрез GET или POST метода, те ще бъдат кодирани с urlencode от клиентския браузър и автоматично декодирани с urldecode от PHP. Така че, вие няма нужда да изпозвате кодиране/декодиране на данните, тъй като това ще бъде изпълнено автоматично.

Example #3 В URL адрес

<?php
    
echo "<a href='" htmlspecialchars("/nextpage.php?stage=23&data=" .
        
urlencode($data)) . "'>\n";
?>

Забележка: На практика, вие променяте HTML GET заявката и следователно трябва да изплозвате функцията urlencode() за да кодирате данните ръчно. Ще забележите, че & в URL адреса е заменено с &amp;. Въпреки че повечето браузъри ще открият, ако сте го забравили, това не винаги е възможно. Така че, даже и вашият URL адрес да не се генерира динамично, трябва да използвате функцията htmlspecialchars() за да го кодирате.

Опитвам да използвам <input type="image"> таг, но $foo.x и $foo.y променливите не съществуват. $_GET['foo.x'] не съществува също. Къде са те и как да получа достъп до тях?

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

<input type="image" src="image.gif" name="foo" />

Когато потребителя щракне някъде върху изображението, което сте сложили на мястото на стандартния бутон за изпращане на формуляра, текущият формуляр ще бъде предаден към сървъра с две допълнителни променливи: foo.x и foo.y.

Тъй като променливите foo.x и foo.y ще бъдат невалидни в PHP, те автоматично биват преименувани в foo_x и foo_y. Така получавате възможност да използвате тези променливи като всички други в PHP.

Забележка: Интервалите в имената на променливите биват превръщани в долни черти (_).

Как да създавам масиви в HTML <form>?

За да получите данни изпратени от <form> във вид масив към PHP скрипта, трябва да именувате елементите <input>, <select> или <textarea> по следния начин:

<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />

Забележете квадратните скоби след имената на променливите, точно това го прави масив. Може да групирате елементите в различни масиви, като дадете едно и също име на различните елементи:

<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyOtherArray[]" />
<input name="MyOtherArray[]" />

Създават се два масива, MyArray и MyOtherArray, които се предават към PHP скрипта. Също така има възможност да присвоите различни ключове към масивите:

<input name="AnotherArray[]" />
<input name="AnotherArray[]" />
<input name="AnotherArray[email]" />
<input name="AnotherArray[phone]" />

Сега масивът AnotherArray ще съдържа следните ключове 0, 1, email и phone.

Забележка: Присвояването на ключове не е задължително в HTML. Ако не зададете ключове, данните в масивъа ще постъпят по реда им в HTML формуляра. В първият пример ключовете на масива ще са 0, 1, 2, и 3.

Вижте също Функции за масиви and Външни PHP променливи.

Как мога да взема резултатите от select с множествен избор в HTML?

Select тагът с множествен избор в HTML позволява на клиента да избира множество елементи от списък. Тези елементи биват предадени към съответният PHP скрипт. Проблемът идва в това ще всички биват изпращани с едно и също име.

<select name="var" multiple="yes">

Всяка една избрана опция ще бъде предадена на скрипта така:


var=option1
var=option2
var=option3

Всяка стойност ще препокрие предишната стойност на $var променливата. Решението на проблема е да се използва възможността на PHP да създава масив от елемент на формуляра. Ето един пример за употребата на това:

<select name="var[]" multiple="yes">

Това казва на PHP да приема $var за масив и всяко присвояване на стойност към var[] добавя елемент към масива. Първият елемент става $var[0], следващият $var[1], и т.н. Фукцията count() може да се използва за да определите колко елемента са били избрани, а функцията sort() - за да се сортира масива, ако е необходимо.

Забележете, че ако използвате JavaScript, [] на даден елемент, може да създаде проблеми при опит да се върне елемента по име. Затова използвайте ID на даденият елемент във формуляра или следната конструкция:


variable = documents.forms[0].elements['var[]'];

Как да предам променлива от Javascriopt към PHP?

Тъй като JavaScript (обикновенно) е технология от клиентската страна на връзката, PHP (обикновенно) е технология от сървърната част на връзката, а HTTP е протокол, които не поддържа състояние, двата езика не могат директно на споделят данни.

Въпреки това е възможно да се споделят променливи между тях. Един начин това да стане е да генерирате JavaScript код с PHP, по този начин след презареждане на браузъра ще получите указаните променливи обратно към PHP. Примерът по-долу показва как точно да постигнете това -- то позволява на PHP да вземе висичината и ширината на клиентския екран, понякога това с възможно само от клиентската страна на връзката.

<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
  
// извежда променливите
  
echo "Screen width is: "$_GET['width'] ."<br />\n";
  echo 
"Screen height is: "$_GET['height'] ."<br />\n";
} else {
  
// предава променливите
  //   -- POST завката трябва да се обработи по различен начин)

  
echo "<script language='javascript'>\n";
  echo 
"  location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
            
"&width=\" + screen.width + \"&height=\" + screen.height;\n";
  echo 
"</script>\n";
  exit();
}
?>

add a note add a note

User Contributed Notes 3 notes

up
2
smileytechguy at smileytechguy dot com
3 months ago
The (at least that I've found) best way to pass data from PHP to JS is json_encode.  Doing so will convert arrays, strings, numbers, etc. as best as possible.

<?php
$myInt
= 7;
// a bunch of special characters to demonstrate proper encoding
$myString = <<<EOF
" ' ; &\ $
EOF;
$myArr = [1, "str", 2];
$myAssocArr = ["foo" => "bar"];
?>

<script>
var myInt = <?= json_encode($myInt) ?>;
var myString = <?= json_encode($myString) ?>;
var myArr = <?= json_encode($myArr) ?>;
var myAssocArr = <?= json_encode($myAssocArr) ?>;
</script>

This will render the following JS code, which correctly stores the variables:
<script>
var myInt = 7;
var myString = "\" ' ; &\\ $";
var myArr = [1,"str",2];
var myAssocArr = {"foo":"bar"};
</script>

Do note that there are no "s or anything like that around the json_encode output; json_encode handles that for you.
up
-12
jetboy
12 years ago
While previous notes stating that square brackets in the name attribute are valid in HTML 4 are correct, according to this:

http://www.w3.org/TR/xhtml1/#C_8

the type of the name attribute has been changed in XHTML 1.0, meaning that square brackets in XHTML's name attribute are not valid.

Regardless, at the time of writing, the W3C's validator doesn't pick this up on a XHTML document.
up
-24
Jay
4 years ago
If you have a really large form, be sure to check your max_input_vars setting.  Your array[] will get truncated if it exceeds this.  http://www.php.net/manual/en/info.configuration.php#ini.max-input-vars
To Top