本章介绍PHP访问MySql的方法。
如果你对MySQL不是很清晰,可以参看。对于数据库的操作,无非就是以下几个点:- 如何连接到数据库
- 如何执行SQL
- 如何返回数据结果集
- 如何从结果集取出数据
- 关闭连接
1 @ $db = new mysqli( ' localhost ' , ' root ' , ' pwd ' , ' mysql ' );
简单描述以下,这里建立一个mysqli的类,它传入mysql所在的主机名,然后是用户名,用户密码,以及访问的数据库。 过程方法的连接 上面对应的过程方法是 @ $db = mysqli_connect ( ' localhost ' , ' root ' , ' pwd ' , ' mysql ' );
此函数返回的不是一个对象,而是一个连接数据的资源。如果你使用过程方法,必须将资源传递到mysqli的所有其他函数。 在这里需要说明的是mysqli的大多数过程函数都有一个对应的面向接口。通常情况下,过程函数都是以mysqli_开始的,同时需要传入 mysqli_connect返回的数据库连接资源。尝试连接的结果需要检查,万一不成功也好做出相应的处理呀。对于此,可以实用mysqli_connect_errno()来处理。代码可以如下 <? php @ $db = new mysqli ( ' localhost ' , ' root ' , ' password ' , ' mysql ' ); if ( mysqli_connect_errno ()) { echo ' Error: Can not connect to database. ' ; } else { echo ' Connect to database OK ' ; } ?>
或者 1 <? php 2 @ $db = mysqli_connect ( ' localhost ' , ' root ' , ' password ' , ' mysql ' ); 3 if ( mysqli_connect_errno ()) 4 { 5 echo ' Error: Can not connect to database. ' ; 6 } 7 else 8 { 9 echo ' Connect to database OK ' ; 10 } 11 12 ?>
mysqli_connect_errno()将返回一个连接数据库出现的错误代码,如果连接成功,返回0. 选择使用的数据库 在SQL里面,我们可以使用如下SQL来选择数据库 use mysql
那么在PHP里呢?我们可以使用如下代码: 1 $db -> select_db(dbname) // dbname为你选择的数据库
或者 1 mysqli_select_db(db_resource,dbname) // db_resource就是前面提到的数据库的连接资源
执行SQL语句 要查询数据库,我们可以使用mysql_query()函数,在进行此操作前最好把你的sql建立以下,例如 $query = " select * from bookmark where bm_url like ' abc ' ";
需要说明的一点是,这里不需要在SQL语句后加一个分号,这和在MySQL监视器里是不一样的。 现在我们可以调用以下的方式来执行SQL语句。 $result = $db -> query($query)
以上是面向对象的方法,过程方法可以为: $result = mysqli_qurey($db,$query)
面向对象版本返回一个结果对象,过程版本返回一个资源。无论何种方法,都会降结果保存在一个变量里($result)中,这个函数执行失败,将返回false。Ok,给个实例吧。 1 < ?php 2 $db = new mysqli("localhost", "bm_user", "password", "bookmarks"); 3 4 /* check connection */ 5 if (mysqli_connect_errno()) { 6 printf("Connect failed: % s\n", mysqli_connect_error()); 7 exit (); 8 } 9 10 11 /* Create table doesn't return a resultset */ 12 if ($db -> query(" CREATE TEMPORARY TABLE mybookmark LIKE bookmark") === TRUE) { 13 printf(" Table mybookmark successfully created.\n"); 14 } 15 else 16 { 17 echo ' error<br> ' ; 18 } 19 20 $sql = " select * from bookmark limit 10 "; 21 /* Select queries return a resultset */ 22 if ($result = $db -> query($sql)) { 23 printf(" Select returned % d rows.\n", $result -> num_rows); 24 25 /* free result set */ 26 $result -> close (); 27 } 28 29 if ($result = $db -> query(" SELECT * FROM mybookmark", MYSQLI_USE_RESULT)) { 30 31 if ($db -> query(" SET @a : = ' this will not work ' ")) { 32 printf("Error: % s\n", $db -> error); 33 } 34 $result -> close (); 35 } 36 37 $db -> close (); 38 ? > 39 40
或者 <?php$db = mysqli_connect("localhost", "bm_user", "password", "bookmarks");/* check connection */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}/* Create table doesn't return a resultset */if (mysqli_query($db,"CREATE TEMPORARY TABLE mybookmark LIKE bookmark") === TRUE) { printf("Table mybookmark successfully created.\n");}else{ echo 'error<br>';}$sql="select * from bookmark limit 10";/* Select queries return a resultset */if ($result = mysqli_query($db,$sql)) { printf("Select returned %d rows.\n", $result->num_rows); /* free result set */ mysqli_free_result($result);}if ($result = mysqli_query($db,"SELECT * FROM mybookmark", MYSQLI_USE_RESULT)) { if (mysqli_query($db,"SET @a:='this will not work'")) { printf("Error: %s\n", $db->error); } mysqli_free_result($result);}mysqli_close($db);?>
简单吧。 对查询结果的处理 首先确定结果集的行数。我们可以利用下面的代码实现它。 $num_rows = $result -> num_rows;
或 $num_rows = mysqli_num_rows($result)
得到了结果的行数之后,我们就可以处理每个结果了。例如可以有以下代码: 1 for ( $index = 0 ; $index < num_rows; $index ++ ) 2 { 3 // Your code here to handle each record. 4 5 }
为了得到每一行,我们可以调用$result->fetch_assoc()函数或者mysqli_fetch_assoc().如果函数没有返回行,循环将会停止执行。可以为: $row = $result -> fetch_assoc()
或 $row = mysqli_fetch_assoc ( $result )
来实现,如果你曾经在VC里用ODBC操作数据库的话,你会发现有些类似。 那么,我想得到每一列值怎么办呢?很简单,调用 $row [ ' bm_url ' ]
字符串'bm_url'就是列名。 除了上面的方法还有没有其他方法得到每一行呢?还有2种方法: 1) 获取每一行的枚举数组 可以为 $row = $result -> fetch_row()
或 $row = mysqli_fetch_row ( $result )
属性值就是每个数组值,例如$row[0],$row[1]等。 2) 还有一种方法就是将每行返回到一个对象里。 可以为 $row = $result -> fetch_object() 或 $row = mysqli_fetch_object ( $result )
如果访问个列值,实用$row->username,$row->bm_url 断开数据库连接 在前面已经见到了, 结果集的释放: $result -> free() .
或者 mysqli_free_result ( $result )
. 数据库的关闭: $db -> close()
或者 mysql_close ( $db )
使用Prepared语句 这个功能有点类似.net SqlParameter. 先举个例子 1 $insertSql = " Insert into bookmark values(?,?) " ; 2 $stmt = $db -> prepare( $insertSql ); 3 $stmt -> bind_param( $username , $bookmark_url ); 4 $stmt -> execute(); 5 echo $stmt -> affected_rows . ' bookmarks inserted into database. ' ; 6 $stmt -> close();
解释一下。 line 1,需要注意的是2个问号。表示每个数据的位置。在C#里确实@+列名。 line 2:调用 $db -> prepare()构建一个需要处理的资源,过程函数是mysqli_stmt_prepare().line 3:调用 stmt -> bind_param将相应的值绑定到相应的位置上。过程函数是mysqli_stmt_bind_param.line 4:执行语句。需要注意的是,在PHP5RC2版本里,Windows下执行有时会crash掉,但在unix下却运行正常。