什么是在PHP中转义引号的意义

时间:2010-04-18 07:43:36

标签: php

这是我正在学习的书中的验证脚本,为什么要删除引号necassery?例如<option value=\"char\">char</option>

<?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>

8 个答案:

答案 0 :(得分:7)

转义字符串中的引号可防止它们结束字符串。例如:

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

PHP解析器基本上会看到多个语句:"Hi this is a"broken"string "。它变成了无效的代码行。

当解析器遇到第一个引号时,它知道它找到了一个字符串,它知道下一个引号告诉它字符串结束的位置。如果你想在你的字符串中加上引号 ,你需要通过在前面用反斜杠转义它们来告诉解析器它们不是字符串的结尾。

如果用单引号'开始字符串,那么你只需要在字符串中转义单引号。与双引号相同。这两行都是有效的代码:

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

您只需要注意用于打开和关闭字符串的任何一个。

答案 1 :(得分: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 :(得分: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>';

答案 3 :(得分:2)

转义引号是必要的,因为PHP解析器会假设这些引号结束字符串而不是字符串的一部分。

为了避免转义引号,在某些情况下你可能会使用撇号,但是在撇号中包含的字符串内的变量不会被解析(即变量的内容不会被输出,只有变量的名称)。

然而,当一次输出多行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组成时,它可能是理想的,因为您不必担心转义任何引号。

答案 4 :(得分:1)

如果引用带有"的字符串然后在字符串中使用该字符,它将结束字符串。相反,请同时使用'"

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

答案 5 :(得分:1)

您可以使用它们告诉PHP引号是字符串的一部分,而不是它的结尾。例如:

my_string = "hello "world"";

会出错,PHP解析器会混淆。你可以选择逃避它们:

my_string = "hello \"world\"";

或使用单引号分隔字符串:

my_string = 'hello "world"';

答案 6 :(得分:1)

$form_block = "
<form action=\"do_createtable.php\"...

存储在例如form_block中的字符串用引号括起来表示它是一个字符串。

现在该字符串包含字符串中的引号字符,但是如果您要用简单的“没有转义”来表示该引号,那么php解释器将理解为字符串的结尾。

E.g。

$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="

答案 7 :(得分: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;在各自的行中