php[tek] 2018 : Call for Speakers

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 5 notes

up
-2
martellare at hotmail dot com
14 years ago
I do not think you are right about not being able to specify something for the value attribute, but I can see where you would have thought it would fail:

A fair warning about testing to see if a variable exists...
when it comes to strings, the values '' and '0' are interpreted as false when tested this way...

<?php
if ($string) { ... }  //false for $string == '' || $string == '0'
?>

The best practice for testing to see if you received a variable from the form (which in the case of a checkbox, only happens when it is checked) is to test using this...

<?php
if ( isSet($string) ) { ... } //true if and only if the variable is set
?>

The function tests to see if the variable has been set, regardless of its contents.

By the way, if anyone's curious, when you do make a checkbox without specifying the value attribute, the value sent from the form for that checkbox becomes 'on'.  (That's for HTML in general, not PHP-specific).
up
-4
jetboy
11 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
-8
martellare at hotmail dot com
14 years ago
A JavaScript Note: Using element indexes to reference form elements can cause problems when you want to add new elements to your form; it can shift the indexes of the elements that are already there.

For example, You've got an array of checkboxes that exist at the beginning of a form:
===================

<FORM>
    <INPUT type="checkbox" name="fruits[]" value="apple">apple
    <INPUT type="checkbox" name="fruits[]" value="orange">orange
    <INPUT type="checkbox" name="fruits[]" value="banana">banana
</FORM>

===================
... These elements could be referenced in JavaScript like so:
===================

<SCRIPT language="JavaScript" type="text/javascript">
<!--
    var index = 0; //could be 1 or 2 as well
    alert(document.forms[0].elements[index]);
//-->
</SCRIPT>

===================
However, if you added a new textbox before these elements, the checkboxes indexes become 1 - 3 instead of 0 - 2;  That can mess up what ever code you create depending on those indexes.

Instead, try referencing your html arrays in JavaScript this way.  I know it works in Netscape 4 & IE 6, I hope it to some extent is universal...
===================

<SCRIPT language="JavaScript" type="text/javascript">
<!--
    var message = "";
    for (var i = 0; i < document.forms[0].elements['fruits[]'].length; i++)
    {
        message += "events[" + i + "]: " + document.forms[0].elements['fruits[]'][i].value + "\n";
    }
    alert(message);
//-->
</SCRIPT>

===================
up
-14
davis at risingtiger dot net
13 years ago
I thought this might be useful to fellow PHP heads like myself out there.

I recently came across a need to transfer full fledged mutli-dimensional arrays from PHP to JAVASCRIPT.

So here it is and hopefuly good things come from it.

<?php
function phparray_jscript($array, $jsarray)
{
    function
loop_through($array,$dimen,$localarray)
    {
        foreach(
$array as $key => $value)
        {
            if(
is_array($value))
            {
                echo (
$localarray.$dimen."[\"$key\"] = new Array();\n");
               
loop_through($value,($dimen."[\"".$key."\"]"),$localarray);
            }
            else
            {
                echo (
$localarray.$dimen."[\"$key\"] = \"$value\";\n");
            }
        }
    }

    echo
"<script language=\"Javascript1.1\">\n";
    echo
"var $jsarray = new Array();\n";
   
loop_through($array,"",$jsarray);
    echo
"</script>";
}
?>
up
-14
Jay
3 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