2015-10-19 74 views
0

我在我的代碼中有很多SQL語句,我試圖轉換爲PDO,因爲我剛剛瞭解它並且我喜歡它。PDO更新不同數量的字段,相同的語句

我的問題是,你可以只更新1或2在準備的語句或不是那樣工作的領域。

我有表和用戶繞過我的網站,某些領域得到更新,如「lastlogin」或「我的地址」等,但所有存儲在一個「用戶」表中有24 +列。

是否可以使用1個PDO語句單獨更新這些字段,或者是否需要爲每個要更新的變體編寫一個新的PDO語句。如果我想更新城市和州,我必須爲此提供單獨的PDO。或者如果我想要做地址和郵政編碼,一個單獨的,等等

我想決定是否使用準備好的語句是完全值得的(因爲我將不得不寫一個50列變化的1000年的錶行)或者我應該只使用準備好的語句來處理大條目,然後按照其他方式(見此處)並根據需要進行消毒。

$sql = "DELETE FROM addresses WHERE usernumber = '$usernumber' and number = '$add_to_del'"; 
$result = mysqli_query($conn,$sql); 
+0

如何「其他方式」減少你需要寫SQL語句的數量? – Steve

+0

我在想PDO方法會減少我必須編寫的代碼,因爲我可以調用我準備好的語句(所以我不必一遍又一遍地寫入「UPDATE table SET」或「SELECT * FROM table」但是由於我在寫完這個問題之後做了更多的研究,我想知道我是否真正瞭解PDO。我可能不得不更多地研究它,因爲看起來我可以在編寫語句時準備語句,而不必傳遞變量。 .. – DerekConlon

+0

你可以使用'Stored Procedures'獲得所有的樂趣 - 傳遞表名,字段名稱和值作爲參數 – RamRaider

回答

0

答案是:是的。

PDO就像mysql_一樣是一個抽象層,但是更好一些。

要重寫你的榜樣查詢在PDO,你會做這樣的事情:

$sql = 'DELETE FROM addresses WHERE usernumber = :usernumber and number = :add_to_del'; 
$sth = $db->prepare($sql); 
$sth->execute(array(':usernumber' => $usernumber, ':add_to_del' => $add_to_del)); 

我想你誤解了PDO是。 PDO就像mysql_抽象層一樣,但是更安全(因爲準備好的語句)並且具有比舊的depreceated mysql_庫更多的功能。

強烈建議您重構代碼以使用類似PDO或MySQLi的代碼。 mysql_(mysql_query等)已被棄用,這意味着它不再受PHP支持,並將在未來的版本中被刪除(如果尚未)。

+0

我使用的是mysqli_(不是mysql_),但那需要我執行自己的衛生注射,這就是爲什麼我試圖學習PDO就是從我的代碼中刪除有關sql注入的「人爲錯誤」因素 – DerekConlon

+2

@DerekConlon mysqli_已準備好語句,您不必自己做衛生設施。 – Barmar

+0

@DerekConlon請參閱'mysqli_prepare()'和'mysqli_stmt_bind_param()'。 – Barmar

0

我明白你的問題如下:

我可以執行查詢:UPDATE my_table SET a=1UPDATE my_table SET b=2只使用一個語句

答案是NO。準備好的陳述不會解決您的問題。你可以做的是編寫一個完整的更新SQL語句,並使用不同的值運行它(同一個),傳遞未修改字段的現有值。

比如你有一個表:

|a|b|c|d|e| 
----------- 
|1|1|1|1|1| 
|2|2|2|2|2| 
|3|3|3|3|3| 

要更新1 = 5的第一行,C = 7的第二和E = 9的最後一次。所以事先準備好的聲明的樣子(匿名參數):

UPDATE my_table SET a=?, b=?, c=?, d=?, e=? WHERE a=? 

你的數據火了:

array(5,1,1,1,1,1) 
array(2,2,7,2,2,2) 
array(3,3,3,3,9,3) 
+0

或者你可以使用ORM並忘記這些問題:) – Ostin

相關問題