2010-04-18 5 views
2

Voici un script de validation d'un livre que je suis d'apprentissage, Pourquoi s'échapper de la citation marque necassery? par exemple. <option value=\"char\">char</option>quel est le point d'échapper guillemets en php

<?php 
//validate important input 
if ((!$_POST[table_name]) || (!$_POST[num_fields])) { 
    header("location: show_createtable.html"); 
      exit; 
} 

//begin creating form for display 
$form_block = " 
<form action=\"do_createtable.php\" method=\"post\"> 
<input name=\"table_name\" type=\"hidden\" value=\"$_POST[table_name]\"> 
<table cellspacing=\"5\" cellpadding=\"5\"> 
    <tr> 
    <th>Field Name</th><th>Field Type</th><th>Table Length</th> 
    </tr>"; 

//count from 0 until you reach the number fo fields 
for ($i = 0; $i <$_POST[num_fields]; $i++) { 
    $form_block .=" 
    <tr> 
    <td align=center><input type=\"texr\" name=\"field name[]\" 
    size=\"30\"></td> 
    <td align=center> 
    <select name=\"field_type[]\"> 
     <option value=\"char\">char</option> 
     <option value=\"date\">date</option> 
     <option value=\"float\">float</option> 
     <option value=\"int\">int</option> 
     <option value=\"text\">text</option> 
     <option value=\"varchar\">varchar</option> 
     </select> 
    </td> 
    <td align=center><input type=\"text\" name=\"field_length[]\" size=\"5\"> 
    </td> 
</tr>"; 
} 

//finish up the form 
$form_block .= " 
<tr> 
    <td align=center colspan=3><input type =\"submit\" value=\"create table\"> 
    </td> 
</tr> 
</table> 
</form>"; 

?> 

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Create a database table: Step 2</title> 
</head> 

<body> 
<h1>defnie fields for <? echo "$_POST[table_name]"; ?> 
</h1> 
<? echo "$form_block"; ?> 

</body> 
</html> 

Répondre

7

Échapper les guillemets dans une chaîne qui les empêche de mettre fin à la chaîne. Par exemple:

$str = "Hi this is a "broken" string"; 

essentiellement l'analyseur PHP voit plusieurs statments: "Hi this is a", broken et "string ". Cela devient une ligne de code invalide.

Lorsque l'analyseur rencontre la première guillemet, il sait qu'il a trouvé une chaîne, et il sait que la prochaine guillemet indique là où se termine la chaîne. Si vous voulez avoir des guillemets à l'intérieur votre chaîne, vous devez indiquer à l'analyseur qu'ils ne sont pas la fin de la chaîne en les échappant à barres obliques inverses.

Si vous démarrez votre chaîne avec des guillemets simples, ', alors vous ne devez échapper à des guillemets simples dans votre chaîne. Pareil avec des guillemets doubles. Ces deux lignes sont les deux codes valides:

$str = "This string is 'not' broken"; 
$str = 'This string is also "not" broken'; 

Vous avez juste à regarder pour celui que vous avez utilisé pour ouvrir et fermer la chaîne.

2

Lorsque vous démarrez une chaîne avec ", une séquence d'échappement " intérieur marquera la fin de la chaîne:

$str = " A string can be enclosed in ' or "."; 
             ^
this " which is not escaped will prematurely end the string. 

Pour éviter cela, nous échapper à toute " apparaissant dans les ""

$str = " A string can be enclosed in ' or \"."; 

De la même manière, un caractère "non enfermé dans une chaîne enfermée dans" provoquera des problèmes.

Un simple travail est là pour se rendre compte qu'un " intérieur ' ' est traité littéralement et si un ' intérieur " "

Donc, si vous voulez éviter échapper " vous pouvez placer la chaîne en ' ' mais à l'intérieur d'une des variables ' ' sera ne pas être interpolé, vous devez vous en souvenir.

2

Il est là nécessaire parce que vous affectez la valeur à une chaîne. Vous pouvez également utiliser des guillemets simples et ne pas avoir à échapper des guillemets doubles, mais vous devez être prudent et échapper à toutes les guillemets simples dans la chaîne:

$form_block .= ' 
<tr> 
<td align=center><input type="texr" name="field name[]" 
size="30"></td> 
<td align=center> 
    <select name="field_type[]"> 
     <option value="char">char</option> 
     <option value="date">date</option> 
     <option value="float">float</option> 
     <option value="int">int</option> 
     <option value="text">text</option> 
     <option value="varchar">varchar</option> 
     </select> 
</td> 
<td align=center><input type="text" name="field_length[]" size="5"> 
</td> 
</tr>'; 
1

Si vous citez une chaîne avec " et ensuite utiliser ce caractère dans la chaîne, il mettra fin à la chaîne. Au lieu de cela, utilisez-vous les utiliser à la fois ' et "

'<option value="char">char</option>'

1

à dire que PHP les guillemets font partie d'une chaîne et non la fin de celui-ci.Par exemple:

my_string = "hello "world""; 

donnerait une erreur, l'analyseur PHP est confus. Vos options sont soit de les échapper:

my_string = "hello \"world\""; 

ou utilisez des guillemets simples pour délimiter la chaîne:

my_string = 'hello "world"'; 
1
$form_block = " 
<form action=\"do_createtable.php\"... 

La chaîne stockée dans, par exemple, form_block est enfermé entre guillemets pour indiquer que c'est une chaîne.

Maintenant, cette chaîne contient le caractère guillemet dans la chaîne, mais si vous devez représenter cette guillemet avec un simple », sans échapper, l'interpréteur PHP comprendra que la fin de la chaîne.

Par exemple,

$form_block = " 
<form action=\"do_createtable.php\" 
//   ^
//   | 
//   escaped quotation mark, part of string. 
//  notice how this text is red because it's a string. 
//  and I need to end this line with a quotation mark to end the string." 
$form_block = " 
<form action="do_createtable.php\" 
//   ^
//   | 
//   not escaped quotation mark, so string will end there, it will be "<form action=" 
2

Échapper les guillemets est nécessaire, car l'analyseur PHP considérerait que ces guillemets mettre fin à la chaîne au lieu d'être une partie de la chaîne.

Pour éviter esca Ping les guillemets, vous pouvez dans certains cas utiliser des apostrophes à la place, mais les variables à l'intérieur des chaînes enfermées dans des apostrophes ne seront pas analysées (c.-à-d. le contenu de la variable ne sera pas édité, seul le nom de la variable).

Cependant, ni les guillemets simples ni les guillemets doubles ne sont si favorables lors de la sortie de plusieurs lignes de HTML en une fois. Peut-être que le livre ne voulait pas confondre le lecteur ou introduire de nouveaux concepts, mais en général, si vous avez un long bloc HTML que vous voulez sortir sans variables, alors il vaut mieux quitter le mode PHP, comme:

<?php 
for ($i = 0; $i < 10; $i++) 
{ 
?> 
Some text goes here 
<input type="text" name="textfield[]" /> 
<br /> 
<?php 
} 
?> 

Ceci est optimal à la fois pour le calcul et vous permet d'écrire le texte sans vous soucier des séquences d'échappement ou quoi que ce soit de ce genre. Cependant, si vous avez besoin de variables, cela peut ne pas toujours être la meilleure solution (bien que vous puissiez toujours revenir en mode PHP pour sortir la variable). À ces fins, il y a la syntaxe heredoc pour les chaînes. Par exemple:

<?php 
for ($i = 0; $i < 10; $i++) 
{ 
    echo <<<SOMELABEL 
Text number $i: 
<input type="text" name="textfield[$i]" /> 
<br /> 
SOMELABEL; 
} 
?> 

La chaîne se compose de tout le texte qui commence à partir du <<<SOMELABEL jusqu'à ce que la ligne qui ne contient que le texte SOMELABEL; (évidemment, vous pouvez nommer le label que vous voulez). Toutes les variables et la séquence d'échappement PHP fonctionnent dans la syntaxe heredoc, donc cela peut être idéal, quand la chaîne se compose de plusieurs lignes de HTML, car vous n'avez pas besoin de vous soucier d'échapper des guillemets.

0

vous pouvez contourner aussi échapper à des citations du tout en utilisant quelque chose comme

echo <<<EOD 
    <td align=center><input type="texr" name="field name[]" 
    size="30"></td> 
    <td align=center> 
     <select name="field_type[]"> 
      <option value="char">char</option> 
      <option value="date">date</option> 
      <option value="float">float</option> 
      <option value="int">int</option> 
      <option value="text">text</option> 
      <option value="varchar">varchar</option> 
      </select> 
EOD; 

echo <<<EOD; et EOD; sont sur leurs propres lignes

Questions connexes