2015-10-19 77 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

相关问题