0

我尝试理解 PHP 中的手动转义。我读了这个例子:

    如果($_POST)
  {    
    $query = '更新
                赫斯特勒
              放
                zulieferer = \''.mysql_real_escape_string($_POST['zulieferer']).'\',
                Telefon = \''.mysql_real_escape_string($_POST['telefon']).'\',
                城市 = \''.mysql_real_escape_string($_POST['telefax']).'\'
              在哪里
                id = '.$_POST['id'];
    $update = mysql_query ($query) 或死 (mysql_error());
  }

该语句以撇号开头。不幸的是,我找不到描述。

第一部分?'更新赫斯特勒 SET zulieferer = \'

第二部分?'.mysql_real_escape_string($_POST['zulieferer'])。'

第三部分?', 电话 = \'

第 4 部分?'.mysql_real_escape_string($_POST['telefon'])。'

4

4 回答 4

0

第一部分是这样的:

'UPDATE 
            hersteller 
          SET
            zulieferer = \''

注意额外的'

转义字符\用于转义第'一个字符,以便将其作为字符插入到字符串中,而不是解释为字符串的结尾。

它类似于:

$message = 'Let\'s get started';

$query = 'INSERT INTO table SET value = \'' . $value . '\'';
于 2013-03-29T13:47:04.190 回答
0

一个\字符将后面的字符标记为“纯文本”或没有意义的文本。这样,您的输出将如下所示zuliefer = 'thevalue'

对于这个例子,如果你不想转义所有字符,你可以用双引号开始变量。

$query = "UPDATE 
        hersteller 
      SET
        zulieferer = '" . mysql_real_escape_string($_POST['zulieferer'])."',
        telefon    = '".mysql_real_escape_string($_POST['telefon'])."',
        city        = '".mysql_real_escape_string($_POST['telefax'])."'
      WHERE 
        id = '".$_POST['id'] . "'";
$update = mysql_query ($query) or die (mysql_error());

-更多阅读 PHP 字符串中的单引号和双引号

-更多关于逃跑的阅读

-关于字符串和其中符号含义的 PHP 手册

于 2013-03-29T13:47:17.657 回答
0

该代码有点难以阅读,原因有两个:

  1. 它在 SQL 语句和 php 字符串中使用单引号
  2. 它是一个跨越多行的长字符串

这可能更容易阅读:

$query = 'UPDATE '.
         '   hersteller '.
         'SET '.
         '   zulieferer = "'.mysql_real_escape_string($_POST['zulieferer']).'", '.
         '   telefon    = "'.mysql_real_escape_string($_POST['telefon']).'", '.
         '   city       = "'.mysql_real_escape_string($_POST['telefax']).'" '.
         ' WHERE  '.
         '   id = '.$_POST['id'];

编辑:关于您的评论:

$query = "DELETE FROM description WHERE id = '" . $this->getId() . "'";

这与我上面重写的目的相同,只是交换了单引号和双引号的使用。它在 SQL 中使用双引号作为 php 字符串分隔符和单引号。两种变体都很好,因为 PHP 和 MySQL 都允许使用这两种引号。您的 $query 变量实际上将包含DELETE FROM description WHERE id = '1234'. 但是请注意,两个版本在语法上并不相同。PHP 处理双引号与单引号有点不同。在双引号中,PHP 将用该变量的内容替换变量名,而在单引号中则不会。

$query = "DELETE FROM description WHERE id='$id'"; <-- PHP will insert the variable $id
$query = 'DELETE FROM description WHERE id="$id"'; <-- PHP will not touch the string
于 2013-03-29T13:48:55.237 回答
0

该语句以撇号开头。不幸的是,我找不到描述。

在 PHP 中,您可以使用一对'或一对". 主要区别在于"-strings也被评估以寻找$变量。

对于这两种字符串类型,您显然可以转义'or"字符以使其出现在字符串中:

echo "He said \"Welcome\".";
// He said "Welcome".

例如,在您的情况下,假设 POST 变量等于x

'zulieferer = \''.mysql_real_escape_string($_POST['zulieferer']).'\''
// zulieferer = 'x'

由于该字符串不使用",我建议您将其重构为:

$a = mysql_real_escape_string($_POST['zulieferer']);
$b = mysql_real_escape_string($_POST['telefon']);
$c = mysql_real_escape_string($_POST['telefax']);
$d = (int) $_POST['id'];
$query = "UPDATE hersteller 
          SET zulieferer = '$a', telefon = '$b', city = '$c'
          WHERE id = $d";

附带说明:您不应该使用mysql_*函数。请改用准备好的语句。

于 2013-03-29T13:50:29.783 回答