2010-04-18 173 views
2

這裏是我正在學習的一本書的驗證腳本,爲什麼逃避引號necassery?例如<option value=\"char\">char</option>什麼是轉義引號在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> 

回答

7

逃脫引號內的字符串阻止他們結束串。例如:

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

本質上PHP解析器看到多個statments:"Hi this is a"broken"string "。它變成了一個無效的代碼行。

當解析器遇到第一個引號時,它知道它找到了一個字符串,並且它知道下一個引號告訴它字符串結束的位置。如果你想在你的字符串裏面有引號,你需要通過在前面用反斜槓轉義它們來告訴解析器它們不是字符串的結尾。

如果你用單引號'開始你的字符串,那麼你只需要在你的字符串中跳過單引號。與雙引號相同。這兩條線都是有效的代碼:

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

你只需要觀察你用來打開和關閉字符串的那一個。

2

當你開始"一個字符串,任何轉義"內將迎來字符串的結尾:

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

爲了避免這種情況,我們逃避任何"出現內""

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

類似地,在''中包含的字符串中的非轉義'會導致問題。

一個簡單的解決辦法是要認識到一個"' '字面上處理等等'" "

所以,如果你想避免逃避"您可以在' '字符串括起來,但裏面一個' '變量將不能插入,你需要記住這一點。

2

這是必要的,因爲您將值分配給一個字符串。你也可以使用單引號,而不必逃避雙引號,但你必須要小心,在字符串中流出的任何單引號:

$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

如果引用"的字符串,然後在字符串中使用該字符,它將結束字符串。取而代之的是,同時使用'"

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

1

您可以使用它們來告訴PHP將引號是字符串的一部分,而不是它的結束。例如:

my_string = "hello "world""; 

會給一個錯誤,PHP解析器就會犯糊塗。你的選擇是要麼逃避他們:

my_string = "hello \"world\""; 

,或者使用單引號來分隔字符串:

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

的字符串存儲在例如,form_block是用引號括起來,以表示它是一個字符串。

現在字符串包含在字符串中的引號字符,但如果你是代表與引號只是一個」,沒有逃避,那麼PHP解釋器會明白,作爲字符串的結尾。

$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

逃脫引號是必要的,因爲PHP解析器,否則假定那些引號結束的而不是字符串的一部分的字符串。

爲了避免ESCA ping引號,你可能會在某些情況下使用撇號,但是用撇號括起來的字符串中的變量不會被解析(即,變量的內容不會被輸出,只有變量的名稱)。

但是,一次輸出多行HTML時,單引號和雙引號都不是那麼有利。也許這本書不想混淆讀者或引入新的概念,但一般來說,如果你有一個很長的HTML塊,你想輸出沒有變量,那麼最好是簡單地退出PHP模式,如:

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

這是最佳的計算,並允許你寫的文本,而不必擔心逃脫序列或類似的東西。但是,如果你需要變量,它可能並不總是最好的解決方案(但是,你總是可以回到PHP模式來輸出變量)。爲了這些目的,有字符串的heredoc語法。例如:

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

該字符串包含所有從<<<SOMELABEL開始到只包含文本SOMELABEL;(很明顯,你能說出你想要的任何標籤)行文字。所有變量和PHP轉義序列都在heredoc語法中工作,所以當字符串由多行HTML組成時,它可能是理想的,因爲您不需要擔心轉義任何引號。

0

你也可以繞過所有使用類似

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;EOD;逃逸報價都在自己的線路