认识php第四天- 与mysql通信

in Develop

asp通过ado与数据库通信
asp.net通过ado.net与数据库通信
php通过xxx与mysql通信
……

php与mysql之间的通信是非常简单的,这里以刚写一个简单的留言本为例进行说明

$pageindex = 1;  //设置当前页码
if(isset($_GET['page']) && is_numeric($_GET['page']))
$pageindex = intval($_GET['page']);  //获取页码
$comments = array();  //初始化评论列表的数组
$pagesize = 5;  //每页显示的记录数

//这里用的是php5的一个新的扩展mysqli,比mysql模块性能更好。
@$db = new mysqli('localhost','root','123456','guestbook');    //建立一个mysql数据库的连接
if(mysqli_errno($db))   //是否有错误发生,如数据库不存在/用户名密码不正确等。
{
echo mysqli_error($db);
exit;
}
$limit = ($pageindex-1)*$pagesize;  //计算起始索引,为分页准备。

$query = 'select count(0) as c from notebook ';  //建立sql语句
$result = $db->query($query);    //调用query方法得到结果。这里的$result是一个'资源"类型的数据
$rowCount = $result->fetch_object();   //将$result 转变为一个object,sql语句中的别名c就是该object的一个属性了,是不是很方便呢?
$rowCount = $rowCount->c;

//分页查询留言数,注意mysql中limit总是放在语句的最后。
$query = 'select id,username,email,comment,commentDate from notebook order by id desc limit '.$limit.','.$pagesize;
$result = $db->query($query);
//mysqli_fetch_array方法将$result变量转为一个数组并且赋值给$row变量,$row变量为一数组,该数组的键为sql语句中的各字段,值为字段值。
while($row = mysqli_fetch_array($result))
{
$comments[] = array('id'=>$row['id'],'name'=>$row['name'],'mail'=>$row['mail'],'comment'=>$row['comment'],'dt'=>$row['commentdate']);
}

if($rowCount==0)
echo "暂时没有留言";
else
{
//显示留言
for($i = 0;$i<count($comments);$i++)
{
echo "<div>n";
echo '<div>昵称:'.$comments[$i]['name'].',发表时间:'.$comments[$i]['dt'].'</div>';
echo '<div>'.nl2br($comments[$i]['comment']).'</div>';
echo "</div>";
}
$pager = new pager($pagesize,$pageindex,$rowCount);
$pager->displayPagestr();
mysqli_free_result($result);   //调用mysqli_free_result方法释放$result占用的内存。
}
//其它更多代码

这里主要注意mysqli对象,在构造mysqli实例时可以忽略掉所有的参数,如hostname/username/password/dbname,然后在运行时指定这些参数。
注意上面代码中用到了@来进行容错。
然后直接调用数据库资源的query方法进行查询就行了。
$result = $db->query($query);,注意query方法始终返回一个resource类型的结果。
在这里要注意的是:我们可以用面向对象的方法来处理这个结果,也可以用过程方式来处理。
OOP方式:
$rowCount = $result->fetch_object();
调用$result的fetch_object()方法返回一个object类型数据
过程方式:
$row = mysqli_fetch_array($result),这里用mysqli_fetch_array方法将迭代变量$result,将将每一行数据返回成一个数组。
这二种方式都可以使用。
如果我们的查询是一个select的话,mysqli_num_rows($result)可以得到查询的结果。
如果我们是一个insert/update/delete的话,mysqli_affected_rows($db)可以得到受这条sql语句操作而影响到的记录数。

写入数据:


$post = $_POST;  //$_POST为超级全局变量,保存所有POST过来的数据,以数组形式保存
if(isset($post) && count($post)>0)   //判断$_POST有没有值。
{
if(empty($post['username']) || empty($post['comment']))
{
echo "必须写用户名与内容";
}
else
{
$uname = htmlspecialchars($post['username']);  //具体请参见htmlspecialchars函数。
$email = htmlspecialchars($post['email']);
$comment = htmlspecialchars(($post['comment']));
@ $db = new mysqli('localhost','root','123456','guestbook');
if(mysqli_errno($db)>0)
{
echo mysqli_error($db);
exit;
}
$query = 'insert into notebook (username,email,comment,commentdate,age) values (?,?,?,now(),?)';  //构造sql语句
$smtm = $db->prepare($query);   //构造一个mysqli_stmt类型的变量,参见http://cn2.php.net/manual/en/mysqli.prepare.php
$i = 1;

$smtm->bind_param('ssss',$uname,$email,$comment,$age);   //给占位符赋值,类似于ado.net中的SqlParameter
$smtm->execute();   //执行

//echo mysqli_affected_rows($db).' row(s) affected;';

$db->close();
header('gbook.php5');
exit;
}
}

与mysql的通信就是这么简单
connect->query->close()。

3 Comments

3 Comments

  1. 哈哈,学习了。

  2. 上周也在看PHP圣经,感觉PHP和Python还是很像的。比较简洁。

  3. mysql扩展的mysql_fetch_array函数无法使用mysqli扩展的mysqli_query()函数返回的结果集,不知,有没有什么解决办法

Leave a Reply

Using Gravatars in the comments - get your own and be recognized!

XHTML: These are some of the tags you can use: <a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>