本次使用的demo是MySQL的示例数据库employees, 点击下载地址 ,注意在导入的时候,在employees.sql文件中,将source改成你当前的目录。
PHP中的demo代码可以在 ideone 下载到。
这里使用的是 mysqli 的方式,其他还有mysql和pdo方式,官方有篇比较的3者区别的文章《 Overview 》。
mysqli_connect :
打开一个到 MySQL 服务器的连接。有面向对象风格和过程化风格。
$link = mysqli_connect("localhost", "root", "123456", "employees");//面向过程 $link = new mysqli("localhost", "root", "123456", "employees");//面向对象
如果成功则返回一个 MySQL 连接对象 , 或者在失败时返回 FALSE 。
set_charset 与 query 。query在下面就会有讲到,这里的话其实就是执行一条语句“SET NAMES utf8”。
设置在数据库间传输字符时所用的默认字符编码。
$link->query("SET NAMES utf8");//执行语句 mysqli_set_charset($link, 'utf8');//面向过程 $link->set_charset('utf8');//面向对象
成功时返回 TRUE , 或者在失败时返回 FALSE 。
mysqli_query 与 query 。返回的信息中并没有记录信息,需要再使用方法获取。
$sql = 'select * from employees limit 10'; $result = mysqli_query($link, $sql);//面向过程 $result = $link->query($sql);//面向对象
失败时返回 FALSE , 成功执行SELECT, SHOW, DESCRIBE或 EXPLAIN查询会返回一个 mysqli_result 对象 ,其他查询则返回 TRUE 。
接下来的2和3就是根据 mysqli_result 对象来的。
还有就是下面的所有方法都有面向过程和面向对象的方式,为了节省篇幅,下面例子都是面向对象的方式。
fetch_all、fetch_array、fetch_assoc与fetch_row,返回的是array。
fetch_fields、fetch_field、fetch_object与fetch_field_direct,返回是stdClass Object。
data_seek :
重置指针到起始,当做fetch_fields、fetch_assoc等读取数据的时候,指针会变化。
fetch_all :
返回记录数组,这个方法有可以传递一个参数resulttype,三个常量MYSQLI_ASSOC, MYSQLI_NUM, or MYSQLI_BOTH。默认是MYSQLI_NUM。
$data = $result->fetch_all(MYSQLI_ASSOC);
获取所有结果行并返回结果集作为 关联数组 , 数字数组 ,或 两者兼而有之 。
下面的第一张返回结果图,引用的参数是MYSQLI_ASSOC,第二张引用的参数是MYSQLI_NUM。其实就是key的不同。
fetch_array :
返回 一条记录数组 ,或没有记录返回 NULL 。与fetch_all一样,也有个参数resulttype,三个常量供选择。默认是MYSQLI_BOTH。
$data = $result->fetch_array(MYSQLI_ASSOC);
fetch_assoc :
没有resulttype参数,返回的是 一条关联数组 ,或者没记录返回 NULL 。如果数组中包含相同的键名,那么将取最后一列。
fetch_row :
同样没有resulttype参数,返回的是 一条数字数组 ,或者没有记录返回 NULL 。
fetch_fields :
用此方法获取表中所有的字段信息,包括字段名、字段长度、所属表等。
返回 多个对象的数组 ,如果没有就返回 FALSE 。
fetch_field :
与上面的方法相对,只会获取某一个字段信息。配合 field_seek ,可以根据需要获得某个位置的字段信息。
返回 一 个对象的数组 ,如果没有就返回 FALSE 。
$result->field_seek(1); $fields = $result->fetch_field();
注意上面的代码,返回的将是第二个字段的信息。
fetch_object :
可以传入两个参数class_name和params,返回 一个关联对象 ,如果没有数据返回 NULL 。
fetch_field_direct :
可以传入一个参数fieldnr,也就是字段的位置。效果等效于上面的 fetch_field 与 field_seek 的配合。
employees表的主键原先不是自增长的,我后面改了下字段,目前表中有499999条数据。
$sql = "insert into employees(`birth_date`,`first_name`,`last_name`,`gender`,`hire_date`) values ('1988-10-9', 'pw', 'strick', 'M', '1988-10-9')"; $result = $link->query($sql); var_dump($link->affected_rows);//受影响行数 var_dump($link->insert_id);//主键 //print_r(mysqli_error($link));//打印错误信息
上面的$result返回的将是一个boolean值,而主键和影响行数是需要从mysqli对象中获取。
3.1、添加更新等操作
预处理能有效的防止sql注入的产生, mysqli_stmt 是预处理类。
$sql = "insert into employees(`birth_date`,`first_name`,`last_name`,`gender`,`hire_date`) values (?,?,?,?,?)"; $stmt = $link->prepare($sql);//获得预处理对象//bind_param中的第N个参数,必须得用变量赋值 $birth_date = '1989-10-9';$first_name = 'pw2';$last_name = 'strick2';$gender = 'M';$hire_date = '1988-10-9'; $stmt->bind_param('sssss', $birth_date, $first_name, $last_name, $gender, $hire_date);//绑定时使用变量绑定 //$stmt->bind_param('sssss', '1989-10-9', 'pw2', 'strick2', 'M', '1988-10-9');//不能使用这种方式 $stmt->execute();//执行预处理 var_dump($stmt->insert_id);//主键 var_dump($stmt->affected_rows);//受影响行数
prepare :
初始化一个预处理对象,传入string类型的查询语句。返回一个 mysqli_stmt 对象,失败则返回 FALSE 。
bind_param :
绑定预处理查询语句中的变量。第一个参数是指定数据类型。
3.2、查询
$sql = 'select * from employees limit ?'; $stmt = $link->prepare($sql); $count = 10; $stmt->bind_param("i", $count); $stmt->execute(); $result = $stmt->get_result();//结果集取后的操作就和之前一样了
与上面不同的就是要先 prepare 和 bind_param ,然后 execute ,最后是 get_result 获取一个 mysqli_result 对象,接下来就是和上面的操作一样了。
demo数据库下载:
http://download.csdn.net/detail/loneleaf1/9271903
demo代码下载:
http://ideone.com/uSzZTi
参考资料:
http://segmentfault.com/a/1190000003841357 PHP mysqli 操作数据库