2012-04-06 67 views
1

我有以下的代碼行,除了一個順利執行正常。它會將變量名稱打印到數據庫中。PHP數據庫獲取變量

我用這個代碼在我scrips之一:

$con = mysql_connect("MyServer","MyDB","myPwd"); 
mysql_select_db("MyDB", $con); 
$sql = "INSERT INTO `MyDB`.`Shipping` (`ID`, `FIRSTNAME`, `LASTNAME`, `ADDRESS1`, `ADDRESS2`, `CITY`, `STATE`, `ZIP`, `ORDERNUMBER`, `SHIPPINGTYPE`, `item1`, `item2`, `item3`, `item4`, `item5`, `item6`, `item7`, `item8`, `item9`, `item10`) VALUES (NULL, \'$first_name\', \'lname\', \'addr\', \'\', \'city\', \'state\', \'zip\', \'ordernum\', \'\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\');"; 
mysql_query("$sql"); 
mysql_close($con); 

此代碼打印跟隨着到數據庫:

$first_name lname addr  city state zip 0  0 0 0 0 0 0 0 0 0 0 

注意,變量名,變量不是內容被打印。我怎樣才能打印出可變的內容?

+2

請注意[SQL注入](http://en.wikipedia.org/wiki/SQL_injection) – cambraca 2012-04-06 21:14:55

回答

2

注意,變量名,變量的不是內容印刷

這是因爲你沒有傳遞變量的插入語句,而要傳遞未定義的常量(?); lname,addr等。您應該將您分配的值傳遞給:(假設)$ lname,$ addr等。

另外,您不需要爲ID列傳入NULL。如果它設置爲auto_increment,數據庫將爲您創建此值。

您還應該利用由表架構定義的默認列值,因此您最終不會傳入具有默認值的大量變量列表,例如,如果您有一個DEFAULT 0作爲架構項目1,項目2,項目3等,你可以簡單地進行以下插入:

$sql = 
"INSERT INTO `MyDB`.`Shipping` (`FIRSTNAME`, `LASTNAME`, `ADDRESS1`, `CITY`, `STATE`, `ZIP`, `ORDERNUMBER`) VALUES ('$first_name', '$lname', '$addr', '$city', '$state', '$zip', '$ordernum');"; 

該數據庫將自動填充項目1,項目2,其中0等欄目爲您服務。

正如cambraca提到的那樣,如果您將變量直接傳遞到您的查詢中,您可能會冒SQL injection的風險。你應該閱讀如何prepare你的查詢,這也會迫使你使用mysqli(vs過時的mysql)api。或者更好,請閱讀PDO

0

我想不要在PHP中的字符串中使用內聯變量,並且當你不需要的時候你正在轉義。試試這個:

$con = mysql_connect("MyServer","MyDB","myPwd"); 
mysql_select_db("MyDB", $con); 
$sql = "INSERT INTO `MyDB`.`Shipping` (`ID`, `FIRSTNAME`, `LASTNAME`, `ADDRESS1`, `ADDRESS2`, `CITY`, `STATE`, `ZIP`, `ORDERNUMBER`, `SHIPPINGTYPE`, `item1`, `item2`, `item3`, `item4`, `item5`, `item6`, `item7`, `item8`, `item9`, `item10`) VALUES (NULL, '".$first_name."', 'lname', 'addr', '', 'city', 'state', 'zip', 'ordernum', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');"; 
mysql_query($sql); 
mysql_close($con); 
+0

'''','「.lname。」'''.addr。'''hmm :):thinker : – hjpotter92 2012-04-06 21:18:27

+0

已經更正了...... – Philipp 2012-04-06 21:21:04

+0

使用連接而不是插值也不會有任何區別 – cantlin 2012-04-06 21:28:27

0

更改插入語句:

$sql = "INSERT INTO `MyDB`.`Shipping` 
    (`ID`, `FIRSTNAME`, `LASTNAME`, `ADDRESS1`, `ADDRESS2`, `CITY`, 
    `STATE`, `ZIP`, `ORDERNUMBER`, `SHIPPINGTYPE`, `item1`, `item2`, 
    `item3`, `item4`, `item5`, `item6`, `item7`, `item8`, `item9`, `item10`) 
    VALUES (NULL, '{$first_name}', 'lname', 'addr', '', 'city', 'state', 
    'zip', 'ordernum', '', '0', '0', '0', '0', '0', '0', '0', 
    '0', '0', '0');"; 

另外,請檢查您的$first_name正確賦值。

+0

那些大括號將會完全沒有區別 – cantlin 2012-04-06 21:19:14

2

對於你有一個報價問題。你似乎有雙引號,然後逃脫單引號。如果您的字符串是雙引號,請勿逃避您的單引號。

看起來值$first_name應該工作。這是確切的代碼?因爲如果你在整個事情中有單引號,它會創建你所描述的輸出。

所有其他列都不是變量,因此很難知道您要做什麼。如果你不打算使用它們,爲什麼要引用它們?

在您的mysql_query再次請求不要報價$sql

最後檢查mysql_error()的錯誤。這可能是你在數據庫中看到一些舊的東西,而你的代碼根本無法工作。

考慮使用PDO。它支持佔位符,比本地mysql_ *接口更好的安全性和更好的調試。

+0

同意。是一個混亂的情況。 – 2012-04-06 21:43:45

0

而不是使用\'$first_name\'\"$first_name\"代替它,其他變量也一樣。