phppdo数据库 php 数据库( 四 )


插入新数据,更新已存数据是一种非常常见的数据库操作 。使用 PDO,这通常需要两个步骤 。本节中所述的所有内容对更新和插入都有效 。
这里有一个最基本的插入示例:
1 # STH means "Statement Handle"
2 $STH = $DBH-prepare("INSERT INTO folks ( first_name ) values ( 'Cathy' )");
3 $STH-execute();
你也可以使用 exec() 完成相同的操作,这将减少调用 。多数情况下,你会使用调用多的方法,以充分利用语句预处理的优势 。即使你只用它一次 , 使用语句预处理 , 帮助你保护你的 SQL 免于注入攻击 。
预处理语句
使用语句预处理将帮助你免于SQL注入攻击 。
一条预处理语句是一条预编译的 SQL 语句,它可以使用多次,每次只需将数据传至服务器 。其额外优势在于可以对使用占位符的数据进行安全处理 , 防止SQL注入攻击 。
你通过在 SQL 语句中使用占位符的方法使用预处理语句 。下面是三个例子:一个没有占位符,一个使用无名占位符,一个使用命名占位符 。
1 # no placeholders - ripe for SQL Injection!
2 $STH = $DBH-("INSERT INTO folks (name, addr, city) values ($name, $addr, $city)");
3
4 # unnamed placeholders
5 $STH = $DBH-("INSERT INTO folks (name, addr, city) values (?, ?, ?);
6
7 # named placeholders
8 $STH = $DBH-("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");
你希望避免第一种方法 。选择命名phppdo数据库我无名占位符将会对你对语句中数据的设置产生影响 。
无名占位符
01 # assign variables to each place holder, indexed 1-3
02 $STH-bindParam(1, $name);
03 $STH-bindParam(2, $addr);
04 $STH-bindParam(3, $city);
05
06 # insert one row
07 $name = "Daniel"
08 $addr = "1 Wicked Way";
09 $city = "Arlington Heights";
10 $STH-execute();
11
12 # insert another row with different values
13 $name = "Steve"
14 $addr = "5 Circle Drive";
15 $city = "Schaumburg";
16 $STH-execute();
这里有两步 。首先 , 我们对各个占位符指定变量(2-4行) 。然后,我们对各个占位符指定数据,并执行语句 。要发送另一组数据,只需改变这些变量的值并再次执行语句 。
这种方法看上去对拥有很多参数的语句很笨拙吧phppdo数据库?的确 。然而,当数据保存于数组中时,这非常容易简略:
1 # the data we want to insert
2 $data = https://www.04ip.com/post/array('Cathy', '9 Dark and Twisty Road', 'Cardiff');
3
4 $STH = $DBH-("INSERT INTO folks (name, addr, city) values (?, ?, ?);
5 $STH-execute($data);
容易吧!
数组中的数据按顺序填入占位符中 。$data[0]是第一个,$data[1]是第二个 , 依次 。不过,要是数组中数据的次序不正确,这将不能正常运行,你需要先对数组排序 。
命名占位符
你可能已经开始猜测语法了,不过下面就是示例:
1 # the first argument is the named placeholder name - notice named
2 # placeholders always start with a colon.
3 $STH-bindParam(':name', $name);
你可以看使用快捷方式,但它需使用关联数组 。下面是示例:
1 # the data we want to insert
2 $data = https://www.04ip.com/post/array('name' = 'Cathy', 'addr' = '9 Dark and Twisty', 'city' = 'Cardiff' );
3
4 # the shortcut!
5 $STH = $DBH-("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");
6 $STH-execute($data);
数组中的键不需要以冒号开头,但其它部分需要同占位符匹配 。如果你有一个二维数组,你只需遍历它,并对遍历的每个数组执行语句 。
命名占位符的另一个好的功能是直接将对象插入到你的数据库中,只要属性同命名字段匹配 。下面是一个示例对象,以及如何将它插入到数据库中的示例:

推荐阅读