2 Stimmen

Welchen Sinn hat es, Anführungszeichen in php zu vermeiden?

Hier ist eine Validierung Skript aus einem Buch, das ich lerne, Warum ist escaping die Anführungszeichen necassery? z.B.. <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>

7voto

zombat Punkte 89911

Wenn Sie die Anführungszeichen innerhalb einer Zeichenkette ausklammern, verhindern Sie, dass sie die Zeichenkette beenden. Zum Beispiel:

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

Im Wesentlichen sieht der PHP-Parser mehrere Statements: "Hi this is a" , broken y "string " . Sie wird zu einer ungültigen Codezeile.

Wenn der Parser auf das erste Anführungszeichen stößt, weiß er, dass er eine Zeichenfolge gefunden hat, und er weiß, dass das nächste Anführungszeichen ihm sagt, wo die Zeichenfolge endet. Wenn Sie Anführungszeichen haben wollen innerhalb müssen Sie dem Parser mitteilen, dass sie nicht das Ende der Zeichenkette sind, indem Sie sie mit vorangestellten Backslashes abschließen.

Wenn Sie Ihre Zeichenfolge mit einfachen Anführungszeichen beginnen, ' müssen Sie nur einfache Anführungszeichen innerhalb der Zeichenkette entschlüsseln. Dasselbe gilt für doppelte Anführungszeichen. Diese beiden Zeilen sind beide gültiger Code:

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

Sie müssen nur darauf achten, welchen Sie zum Öffnen und Schließen der Schnur verwendet haben.

2voto

codaddict Punkte 426877

Wenn Sie eine Zeichenkette mit " , jede nicht abgeschlossene " innerhalb markiert das Ende der Zeichenkette:

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

Um dies zu vermeiden, entgehen wir jeder " erscheinend in ""

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

Ebenso führt ein nicht abgeschnittenes ' in einer in ' ' eingeschlossenen Zeichenkette zu Problemen.

Eine einfache Lösung besteht darin, zu erkennen, dass eine " innerhalb ' ' wörtlich behandelt wird und somit eine ' innerhalb " "

Wenn Sie also eine Flucht vermeiden wollen " können Sie die Zeichenkette in ' ' sondern innerhalb einer ' ' Variablen werden nicht interpoliert, das müssen Sie beachten.

2voto

Robert Speicher Punkte 15112

Das ist notwendig, weil Sie den Wert einer Zeichenkette zuweisen. Sie können auch einfache Anführungszeichen verwenden und müssen keine doppelten Anführungszeichen auslassen, aber Sie müssen vorsichtig sein und alle einfachen Anführungszeichen in der Zeichenfolge auslassen:

$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>';

2voto

Rithiur Punkte 844

Das Escapen der Anführungszeichen ist notwendig, da der PHP-Parser sonst davon ausgehen würde, dass die Anführungszeichen am Ende der Zeichenkette stehen und nicht Teil der Zeichenkette sind.

Um die Anführungszeichen zu vermeiden, können Sie in einigen Fällen stattdessen Apostrophe verwenden, aber Variablen in Zeichenketten, die in Apostrophe eingeschlossen sind, werden nicht geparst (d.h. der Inhalt der Variablen wird nicht ausgegeben, sondern nur der Name der Variablen).

Allerdings sind weder einfache noch doppelte Anführungszeichen besonders vorteilhaft, wenn mehrere HTML-Zeilen in einem Durchgang ausgegeben werden. Vielleicht wollte das Buch den Leser nicht verwirren oder neue Konzepte einführen, aber im Allgemeinen ist es am besten, wenn Sie einen langen HTML-Block haben, den Sie ohne Variablen ausgeben wollen, den PHP-Modus einfach zu verlassen, wie z.B.:

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

Dies ist sowohl rechnerisch optimal als auch ermöglicht es Ihnen, den Text zu schreiben, ohne sich um Escape-Sequenzen oder Ähnliches zu kümmern. Wenn Sie jedoch Variablen benötigen, ist dies nicht immer die beste Lösung (Sie können jedoch jederzeit in den PHP-Modus zurückkehren, um die Variable auszugeben). Für diese Zwecke gibt es die heredoc-Syntax für Strings. Zum Beispiel:

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

Die Zeichenkette besteht aus dem gesamten Text, der mit der <<<SOMELABEL bis zu der Zeile, die nur den Text SOMELABEL; (Sie können das Etikett natürlich nach Belieben benennen). Alle Variablen und PHP-Escape-Sequenzen funktionieren innerhalb der heredoc-Syntax, so dass es ideal sein kann, wenn die Zeichenfolge aus mehreren HTML-Zeilen besteht, da Sie sich nicht um das Escapen von Anführungszeichen kümmern müssen.

1voto

Adam Hopkinson Punkte 27521

Wenn Sie eine Zeichenkette mit " und dann dieses Zeichen innerhalb der Zeichenkette verwenden, wird die Zeichenkette beendet. Verwenden Sie stattdessen beide ' y "

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X