2013-03-29 43 views
0

我嘗試瞭解在PHP中手動轉義。我讀過這個例子:在PHP/MySQL中手動轉義

 
    if ($_POST) 
    {  
    $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()); 
    } 

聲明開始於一個撇號。不幸的是我找不到描述。

第一部分? 'UPDATE hersteller SET zulieferer ='

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

第三部分? ',telefon ='

第四部分? '.mysql_real_escape_string($ _ POST ['telefon'])。'

+0

使用PDO或MySQLi,準備語句是要走的路 – GGio

+1

[**請勿在新代碼**中使用'mysql_ *'函數](http://bit.ly/phpmsql)。他們不再被維護[並且被正式棄用](http://j.mp/XqV7Lp)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 –

+0

你到底明白了什麼? – Quasdunk

回答

0

,第一部分是這樣的:

'UPDATE 
      hersteller 
      SET 
      zulieferer = \'' 

注意額外'

轉義字符\用於轉義第一個',以便它作爲字符插入到字符串中,而不是解釋爲字符串的結尾。

它類似於此:

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

$query = 'INSERT INTO table SET value = \'' . $value . '\''; 
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()); 

- More reading on single quotes and double quotes in PHP strings

- More reading on escaping

- PHP manual on strings and meanings of symbols inside them

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() . "'"; 

此有異曲同工之妙正如我上面的重寫,只交換使用單引號和雙引號。它使用雙引號作爲php中的字符串分隔符和單引號。這兩種變體都很好,因爲PHP和MySQL都允許這兩種引用。您的$查詢變量實際上將包含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 
+0

清晰排列。學到了很多。讓我提出有關這個主題的最後一個問題:

 $qry = "DELETE FROM description WHERE id = '" . $this->getId() . "'";
整個陳述都以引號括起來。價值是首先被包圍的bei點,然後通過引號,最後是一個撇號?如果使用這種代碼風格,我不需要轉義,對吧? – user1662013

0

的語句開始撇號。不幸的是我找不到描述。

在PHP中,您可以使用一對'或一對"來定義字符串。 主要的區別在於"-字符串也被評估以尋求$變量。

對於這兩個字符串類型,你可以明顯地逃脫'"字符,以使其出現在字符串中

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"; 

附註:you shouldn't使用mysql_*函數。改用準備好的語句。

+0

這會給隧道盡頭帶來光明。非常感謝。 – user1662013