header('content-type:text/html;charset=utf-8');
//获取用户提交的name,password
if(isset($_POST['name'],$_POST['password'])){
$name=$_POST['name'];
$password=$_POST['password'];
// echo '<pre/>';
/* 使用mysql,但没有防注入功能,’or 1=1 or 1=1 or’可注入,不安全
$conn=@mysql_connect('localhost','root','');
mysql_query('set names utf8',$conn);
mysql_select_db('kun',$conn);
$mysql="select count(*) from admin where uname='$name' and upassword='$password'"; $result=mysql_query($mysql,$conn);
$i=mysql_result($result,0);
if($i!=0){
echo '登陆成功';
}else{
echo '登陆失败';
}
}
*/
//使用
mysqli $m=new mysqli('localhost','root','','kun'); $m->set_charset('utf8');
$s=$m->prepare("select count(*) from admin where uname=? and upassword=?");//返回一个声明的对象,否则false
$s->bind_param('ss',$name,$password);// 进行校对,成功时返回 TRUE, 或者在失败时返回 FALSE.s-string i-int d-double
$s->execute();//执行
/*
使用预处理语句,防注入
$result=$s->get_result();
$rs=$result->fetch_row();
$i=$rs[0];
if($i!=0){
echo '登陆成功';
}else{
echo '登陆失败';
}
*/
/*使用mysqli预处理语句,参数绑定,防注入’or 1=1 or 1=1 or’ 或‘or 1=1 or 1=1 or --’ $s->bind_result($c);//参数绑定
$s->fetch();
if($c==0){
echo '登陆失败';
}else{
echo '登陆成功';
}
*/
$s->close();
$m->close();
}
第二篇:mysqli笔记
$_mysqli 对属性操作无括号,对方法操作加括号,如果要执行的sql语句很长,分多行写,不然错误很难查找.......
一、数据库连接:
第一种传统写法:
$_mysqli = new mysqli('localhost','root','yangfan','testguest');
第二种传统写法:
$_mysqli = new mysqli();
$_mysqli->connect('localhost','root','yangfan','testguest');
第三种写法:
单独选择一个数据库
$_mysqli = new mysqli('localhost','root','yangfan');
$_mysqli->select_db('testguest');
二、出错提示:
//数据库连接时(用户名,密码错误)
if(mysqli_connect_errno()){
echo '数据库连接出错,错误信息为:'.mysqli_connect_error();
exit();
}
//数据库操作时发生的错误
@$_mysqli = new mysqli('localhost','root','yangfan');
$_mysqli->select_db('aaaa');
if($_mysqli->errno){
echo '数据库操作错误'.$_mysqli->error;
}
三、与数据库进行交互。
1、获取数据
// 设置一下编码 utf8
$_mysqli ->set_charset( "utf8" );
// 创建一句 SQL 语句
$_sql = "SELECT * FROM tg_user" ;
// 执行 sql 语句把结果集赋给 $_result
$_result = $_mysqli ->query( $_sql );//数据库中的所有值
// 将结果集的第一行输出
print_r( $_row=$_result ->fetch_row());//在所有的数据库结果集中查询一列
//第一行第一个
echo $_row[0];
// 释放查询内存 ( 销毁 )
$_result->free();
$_mysqli->close();
2、解析查询结果:
(1)、打印出某一列的所有值:(索引数组)
while($_row = $_result->fetch_row()){
echo $_row[3].'<br>';
}
(2)、打印出某一列的所有值:(关联数组)
$_assoc = $_result->fetch_assoc();
echo $_assoc['tg_username'];
//遍历出所有值:
while($_assoc = $_result->fetch_assoc()){
echo $_assoc['tg_username'].'<br>';
} (3)、打印出某一列的所有值:(关联+索引)
$_array = $_result->fetch_array(); echo $_array['tg_username'];
echo $_array[3];
//风筝
(4)、打印出某一列的所有值:(OOP对象)
$_object = $_result->fetch_object();
echo $_obj->tg_username;
//遍历某列所有值
while($_object = $_result->fetch_object()){
echo $_object->tg_username;//对象用->访问字段
}
3、确定所选择的行和受影响的行
通常希望能够确定 SELECT 查询返回的行数 , 或者受 INSERT 、 UPDATE 或 DELET 查询
影响的行数。我们可以使用 num_rows 和 affected_rows 两个属性 $_sql = "select * from tg_user limit 0,10";
$_result = $_mysqli->query($_sql);
echo $_result->num_rows;//分页的时候可以查询总的页数
//10
// 当使用查询时 , 想了解 INSERT 、 UPDATE 、 DELETE 查询时影响的行 数,可以使用 affected_rows; 注意,它是 $_mysqli 下的属性
echo $_mysqli ->affected_rows; //这里没有括号
4、移动指针的操作和获取字段当你并不想从第一条数据开始获取 ,
或者并不想从第一个字段获取 , 你可以使用数据指
针移动或者字段指针移动的方式调整到恰当的位置 。
当然 , 你还可以获取字段的名称及其相关的属性
// 计算有多少条字段
echo $_reslut ->field_count;
// 获取一个字段的名称
$_field = $_reslut ->fetch_field();
echo $_field ->name;
//取得所有字段名称:
$_rows=$_result->fetch_fields();
foreach($_rows as $_field){
echo $_field->name."<br>";
}
//取得所有字段名称:(等同上边一个)
while (!! $_field = $_reslut ->fetch_field()) {
echo $_field ->name. '<br />' ;
}
// 获取一个字段的名称及相关信息
print_r( $_reslut ->fetch_fields());
// 移动数据指针
//将指针移到第10行的字段的下标为3的值上
$_result-> data_seek(9);//第10行
$_row = $_result->fetch_row();
echo $_row[3];//下标为3的字段
// 移动字段指针(输出的是字段的名称)
$_reslut ->field_seek( 2 );
5、执行多条 SQL 语句
有的时候 , 我们需要在一张页面上同时执行多条 SQL 语句 , 之前的方法就是分别创建多
个结果集然后使用。但这样资源消耗很大,也不利于管理。 PHP 提供了执行多条 SQL 语句
的方法 $_mysqli->multi_query();
$_sql.="UPDATE tg_article SET tg_username='呵呵呵' WHERE tg_id=1;"; $_sql.="UPDATE tg_flower SET tg_fromuser='呵呵呵' WHERE tg_id=1;"; $_sql.="UPDATE tg_friend SET tg_fromuser='呵呵呵' WHERE tg_id=1";//注意分号
$_mysqli->multi_query($_sql);
//mysqli执行语句中,假如有二条执行语句,如果第一条有误,那么二条都不会执行
//如果第一条正确,第二条有误,那么会正常执行第一条,第二条不执行
查询多条语句的结果集,判断哪条有误给出提示:
//创建三条选择语句
$_sql.="SELECT * FROM tg_article;";
$_sql.="SELECT * FROM tg_flower;";
$_sql.="SELECT * FROM tg_friend";
//$_mysqli->multi_query相当于执行单条语句
$_mysqli->query()
if ($_mysqli->multi_query($_sql)) {//在执行多条语句前提下获取判断下面结果
//获取当前的结果集
$_result = $_mysqli->store_result();
print_r($_result->fetch_row());
//第二条
//将结果集的指针移到下一条
$_mysqli->next_result();//下一条结果
$_result = $_mysqli->store_result();
//$_result如果是true返回0
if (!$_result) {
echo '第二条SQL语句有误,请检查!';
exit();
}
print_r($_result->fetch_row());
//第三条
$_mysqli->next_result();
$_result = $_mysqli->store_result();
if (!$_result) {
echo '第三条SQL语句有误,请检查!';
exit();
}
print_r($_result->fetch_row());
} else {
echo '第一条SQL语句有误,请检查!';
exit();
}
6、 执行数据库事务
事务 (transaction) 是作为整个一个单元的一组有序的数据库操作 。 如果一组中的所有操
作都成功 , 则认为事务成功 , 即使只有一个失败操作 , 事务也不成功 。 如果所有操作成功完
成 , 事务则提交 (commit) , 其修改将作用于所有其他数据库进程 。 如果一个操作失败 , 则事
务将回滚 (rollback) ,该事务所有操作的影响都将取消。
首先 , 您的 MySQL 是 InnoDB 或 BDB 引擎的一种 , 一般来说 , 你安装了 AppServ 的集成
包 , 你选择 InnoDB 的引擎的数据库即可 。 如果你建立的表不是 InnoDB , 可以在 phpmyadmin
里修改。
$_sql.="UPDATE tg_flower SET tg_flower=tg_flower+10 WHERE tg_id=1;"; $_sql.="UPDATE tg_friend SET tg_state=tg_state-10 WHERE tg_id=1"; //首先关闭自动提交,否则无效
$_mysqli->autocommit(false);
if($_mysqli->multi_query($_sql)){
//获取第一条影响的行数
$_succeed1 = $_mysqli->affected_rows==1 ?true : false;
$_mysqli->next_result();
$_succeed2 = $_mysqli->affected_rows==1 ?true : false;
//判断是否两条都执行为true;
if($_succeed1 && $_succeed2){
$_mysqli->commit();
echo '交易成功';
exit();
}else{
$_mysqli->rollback();
echo '交易失败,回滚mysql原始';
exit();
}
}else{
echo '第一条语句有误,交易失败';
exit();
}
//最后开启自动提交
$_mysqli->autocommit(true);
在多张表中操作数据库:
$_sql = "SELECT
m.id,m.admin_user,m.level,m.login_count,m.last_ip,m.reg_time FROM cms_manage as m,cms_level as n where m.level=n.level";
$_sql = "SELECT
m.id,
m.admin_user,
m.login_count,
m.last_ip,
m.last_time,
l.level_name
FROM
cms_manage m,
cms_level l
WHERE
l.level = m.level
ORDER BY
m.id ASC
LIMIT
0,10";
$_result->fetch_row()---显示结果集中的一条记录内容,对一条数据进行操作 和count(*)一起使用
$_result->num_rows; ---结果集中的总条数,分页的时候可以查询总的页数
$_mysqli ->affected_rows --执行sql语句后所影响的行数
//获取管理员总记录分页的时候可以使用 public function getManageTotal(){
$_db = DB::getDB();
$_sql = "select count(*) from
cms_manage";
$_result = $_db->query($_sql);
$_total = $_result->fetch_row();
} DB::unDB($_result,$_db); return $_total;