u mysqli扩展库的 预处理技术 mysqli stmt 需要关闭预处理
超全局变量 可以把所有的信息给打印出来
问题的提出?
现在需要向mysql数据库添加100个用户,请问如何实现?
思路:
1. 使用for循环100次,向数据库中添加100个用户.
2. 使用批量添加
$sql1=”insert xxx”;
$ssql.=”insert xxx ”;
。。。
使用
$msyqli->mutil_query($sql1);
3. 方案使用预编译技术,该方案还可以防止sql注入攻击.
实现代码
//预编译演示
//需求: 请使用预处理的方式,向数据库添加三个用户
//1.创建mysqli对象
$mysqli=new MySQLi("localhost","root","hsp123","test");
//2.创建预编译对象
$sql="insert into user1 (name,password,email,age) values(?,?,?,?)";
$mysqli_stmt=$mysqli->prepare($sql) or die($mysqli->error);
//绑定参数
$name="小倩";
$password="xiaoqian";
$email="[email protected]";
$age="200";
//参数绑定->给?赋值,这里类型和顺序都要对应.
//
$mysqli_stmt->bind_param("sssi",$name,$password,$email,$age);
//执行
$b=$mysqli_stmt->execute();
//继续添加
$name="老妖";
$password="laoyao";
$email="[email protected]";
$age="210";
$mysqli_stmt->bind_param("sssi",$name,$password,$email,$age);
//执行
$b=$mysqli_stmt->execute() ;
//继续添加
$name="菜层";
$password="aaa";
$email="[email protected]";
$age="30";
$mysqli_stmt->bind_param("sssi",$name,$password,$email,$age);
//执行
$b=$mysqli_stmt->execute();
if(!$b){
die("操作失败".$mysqli_stmt->error);
}else{
echo "操作ok";
}
//释放
$mysqli->close();
?>
使用预编译技术完成查询任务..-》如何封装..项目中说.
//预编译演示
//需求: 请使用预处理的方式,从数据库查询
//使用预处理的方法,查询所有id>5的用户 的id,name,email
$mysqli=new MySQLi("localhost","root","hsp123","test");
if(mysqli_connect_error()){
die(mysqli_connect_error());
}
//创建一个预定义的对象 ?占位
$sql="select id,name,email from user1 where id>?";
$mysqli_stmt=$mysqli->prepare($sql);
$id=5;
//绑定参数
$mysqli_stmt->bind_param("i",$id);
//绑定结果集
$mysqli_stmt->bind_result($id,$name,$email);
//执行
$mysqli_stmt->execute();
//取出绑定的值
while($mysqli_stmt->fetch()){
echo "
--$id--$name--$email";
}
//还想执行另一个sql
echo "
***********************************";
$id=10;
//绑定参数
$mysqli_stmt->bind_param("i",$id);
//绑定结果集
//执行
$mysqli_stmt->execute();
//取出绑定的值
while($mysqli_stmt->fetch()){
echo "
--$id--$name--$email";
}
//关闭资源
//释放结果
$mysqli_stmt->free_result();
//关闭预编译语句 [这里需要关闭创建的预处理对象]
$mysqli_stmt->close();
//关闭连接
$mysqli->close();
?>
预编译可以自动防止sql (结构化查询语句)注入攻击
使用万能密码
//查询某个管理员是否存在.
$sql=”select * from user1 where name=’ls’ and password=’xxxxxxx’”;
//看看有没查询到用户
if(查询到){
header(“admin.php”);
}else{
header(“login.php”)
}
//解决方案
//1.使用预编译
//2.改变验证数据库用户逻辑
$sql=”select password from user1 where name=’ls’”;
//看看有没有查询到记录
//如果有说明用户存在
if(从数据库查询的密码= =用户输入的密码){
//合法,用户合法
header(“admin.php”);
}else{
header(“ok.php”)
}
☞ 补充一个关于sql语句执行原理的知识点.
u 现在我们看看mysqli的一些其他常用函数
案例: 编写一函数,接收一个表名,然后把表头和表数据,显示页面
function showTable($table_name){
$mysqli=new MySQLi("localhost","root","hsp123","test");
if(mysqli_connect_error()){
die(mysqli_connect_error());
}
//$sql="select * from $table_name";
$sql="desc user1";
$res=$mysqli->query($sql);
//如何获取返回总行数和列数
echo "共有 行".$res->num_rows." -列=".$res->field_count;
echo " //如何取出表头,从$res取出 while($field=$res->fetch_field()){ echo " } echo " //循环取出数据 while($row=$res->fetch_row()){ echo " foreach($row as $val){ echo " } echo " } echo "
";";
";
{$field->name} ";
";
";$val ";
//关闭资源
$res->free();
$mysqli->close();
}
showTable("user1");
?>
授课思路:
mysql 扩展库, mysqli 扩展库 . pdo[放在后面讲解]
现在我们做项目串知识点.
先给大家讲解预定义超全局变量
u PHP中预定义超全局变量
① 什么是全局变量
$a=23;//全局变量,因为该变量在整个作用域(在这个php文件中),都是可见
function test(){
//如果希望使用到全局$a;
global $a;
$a=45;
}
test();
echo $a;
?>
② 什么是超全局变量
超全局变量除了有全局变量的特点外,可以无须申明,直接使用.
快速入门
//超全局变量
$_SERVER['hsp']="韩顺平";
echo "";
echo print_r($_SERVER);
echo ""
提供超全局数组的原因是为了让程序员更方便快捷的写出PHP程序.
③ PHP供提供了九种
1. $_GET
2. $_POST
3. $_REQUEST
4. $_SERVER
5. $_ENV
6. $_FILE
7. $_COOKIE
8. $_SESSION
9. $GLOBALS
u 现在一个一个讲解
1. $_GET
以$_GET原理来分析数据的来龙去脉...
说明原理图:
$_GET 实际使用.
l 客户机(浏览器)通过超链接传送信息给服务器
案例1
test.php页面
//urlencode编码
echo "北京好&name=xiaoming'>传送数据";
?>
面试题: 请问如何处理超链接提交数据的中文乱码问题?
1. 对于高版本的ie 浏览器,无需处理
2. 对应 5.5 和 6.0 ie需要进行urlencode()编码处理
3. 尽量使用字母和数字.
a.php页面
echo "";
echo print_r($_GET);
echo "";
//如果希望指定取出某个数据,则可以通过下标名
echo $_GET['name'];
?>
看看ie5.5 和 ie 6的中文奇数乱码.
解决方法1.
给奇数中文加一个全角空格,然后到服务器接收是,去掉两头的空行 trim()
解决方法2:
使用urlencode 和 urldecode函数
在test.php页面
//这句话是对中文url编码.
$str=urlencode("北京好");
echo "传送数据";
?>
//在a.php 页面中,正常接收。
echo "";
echo print_r($_GET);
echo "";
//如果希望指定取出某个数据,则可以通过下标名,如果php版本低,可能看到是中文,需要使用 urldecode() 来解密
echo "--".$_GET['city'];
?>
_GET也可以接收表单以get方式提交数据
//....
特别说明如何提交表单数据建议使用POST,不要使用GET
使用细节:
u 如果判断是否收到值
a. php
if(empty($_GET['city'])){
echo "没有收到";
}else{
echo "有city";
echo $_GET['city'];
}
//这个方法可以,参看,建议使用empty
if(!isset($_GET['city'])){
echo "没有收到hello";
}else{
echo "有city";
echo $_GET['city'];
}
u 绝对不要启用register_globals 需要 register_globals = Off
u $_POST
描述 : 通过Http POST 方式提交的数据,会被封装到$_POST超全局数组中.
举例: 接收表单信息:
代码:
代码:
register1.php页面
用户注册
用户名:
密码
性别:女 男
你喜欢什么:
唱歌">唱歌
跳舞">跳舞
游泳">游泳
骑马">骑马
你的所在地是:
个人介绍 :
你选择图片
提交"/>
**regiseter2.php***
//看看如何接收
echo "";
echo print_r($_POST);
echo "";
//关心爱好
$name=$_POST['username'];
$pwd=$_POST['passwd'];
//如何接收checkbox提交的数据
$hobbies=$_POST['hobby'];
echo "个人信息如下
";
echo "$name--$pwd";
//print_r($hobbies);
echo "该人的爱好";
foreach($hobbies as $key=>$val){
echo "
$key=$val";
}
echo "
你的所在地是";
$city=$_POST['city'];
echo $city;
echo "
个人介绍如下";
$intro=$_POST['intro'];
echo "
$intro";
echo "查看调查情况"
?>
这里还有一个下拉框的演示
10min:
你编写生活幸福度的调查表,然后把调查的信息,存入到数据库.,看看能否获取数据,显示给用户看.
get数据提交主要是
//当这样的方式跳转的时候,也是以get方式提交给ok.php
header(“Location: ok.php?aaa=xiaoming”);
?>
u post和get区别请参看ppt
① 安全性 post>get
② 数据传输大小 [浏览器] post>get
③ 保存到收藏夹 get比较方便.
u $_REQUST
定义: $_REQUST 中可以包括 $_GET/$POST/$_COOKIE 数组,的信息.
快速入门:
这里就很好理解,看一个案例 :
echo "";
echo print_r($_REQUEST);
echo "";
//如何取出某个值
//$_REQUEST既可以接收get 请求数据,也可以接收post请求、cookie..
//所以这个变量,比较不可以信,不建议使用. $_GET $_POST
echo $_REQUEST['aa'];
//如果不确定get/post
if($_SERVER['http_method']=="post"){
$echo $_POST['名字'];
}else if($_SERVER['http_method']=="get"){
//用 _GET接收.
}
?>
注意事项:
1. 不要经常使用$_REQUEST,
2. 如果不确定_GET/POST
你接收数据时候,可以这样
if($_SERVER[' REQUEST_METHOD’]=="POST"){
$echo $_POST['名字'];
}else if($_SERVER[’ REQUEST_METHOD’]=="GET"){
//用 _GET接收.
}
u $_ENV
该全局数组可以获取环境变量,在php5.3中默认禁用,但是你可以启动,在php.ini文件中启用.
variables_order = "EGPCS"
特别说明一把,在开发和生产环境,不要启用.
u $_FILE / $_COOKIE /$_SESSION
后面讲
u $GLOBALS
包含了全部变量的全局组合数组。变量的名字就是数组的键[手册]
同时一个自定义的全局变量,也会自动的被$_GLOBALS 管理
案例:
echo "aaaa";
echo "";
echo print_r($GLOBALS);
echo "";
?>
当你定义一个全局变量,该变量也会被$GLOBALS管理
$a=900;
echo “”;
print_r($GLOBALS);
echo “”
?>
案例说明:
u zend studio 工具的介绍
功能强大,官方推荐。
ide : 集成开发环境->软件.
u zend studio的第一次接触
开发一个PHP Project
zend studio 是以工程的方式来管理PHP文件/js/css...
1. 创建项目
2. 设置该项目的路径
3. 创建一个文件
test.php
☞ 使用zend studio的细节
1. 将文件的编码设置成utf-8
工具->windows->preferences->见图
zend studio的常用快捷键和调式功能的介绍
1. 提示符助手快捷键
alt+/
你可以自己定义
alt+z
到windows->keys 去修改content assistant
2. 复制当前行
ctrl+alt+ 下光标
3. 删除当前行
ctrl+D
4. 加注释的快捷键
块注释
shfit+ctrl+\
取消
shfit+ctrl+/
行注释
ctrl|+/
第二次就是取消
5. 调试php代码的快捷键
掌握
1. 如何下断点
2. 如何调式 (f5 f6 f7)
调试:
我们为了发现代码的错误,可以逐行执行代码,同时看到,变量的变化,这个过程称为调试. 调试的目的,就是为了发现隐藏的错误
f5 跳入
f6 跳过.(按顺序继续执行)
f7 跳出(函数跳出)
入门案例:
$res=0;
for($i=0;$i<5;$i++){
$res+=$i;
}
echo "res=".$res;
?>
删除断点,可以到PHP Dug 视图下一次性删除
断点:
所谓断点,就是指当我们的程序执行到这里时候,就停止执行,等待程序员指令是否继续执行。
开始编写我们的雇员管理系统.(演变过程 model1->mv->mvc)
主要的目的
1. 培养编写项目的感觉
2. 认识我们的mvc模式.(mvc模式.)
3. 规划项目
4. 融入各个知识点 [php基础、html、数据库、开发模式、cookie/session]
开发:使用原型开发. (模式)
项目开发流程:
需求分析->设计阶段->编码阶段->测试阶段->发布阶段/维护阶段
需求阶段: 需求设计人员./项目经理 对客户(领导) ->需求文档.
设计阶段: 技术人员(架构师 , 组长,程序员) ->设计数据库./选择技术/操作系统
编码阶段: 组长,程序员
测试阶段: 测试人员
发布阶段: 实施人员(实施工程师)
维护阶段: 往往是从开发人员中调.
美工(ps画图)->网页前端人员(html)[原型] ->客户 [ 程序员]
开发: