-
从数据库中查询数据 $sql="SELECT username,email,url,face,content,pubTime FROM comments"; $mysqli_result=$mysqli->query($sql); if($mysqli_result&& $mysqli_result->num_rows>0){ while($row=$mysqli_result->fetch_assoc()){ $comments[]=new Comment($row); } } 将用户提交的信息转换为json数据并提交给文件doAction.php,用户输入信息有误等信息的显示,都是由javascript完成查看全部
-
$res=Comment::validate($arr); //数据在自定义类方法中获取,过滤,保存 //json_encode()对变量进行JSON编码,json_decode()对JSON格式的字符串进行转换为PHP变量. $comment的output()方法 public function output(){ if($this->data['url']){ $link_start="<a href='".$this->data['url']."' target='_blank'>"; //a标签分开写是为了能在a标签中插入其他元素 $link_end="</a>"; } $dateStr=date("Y年m月d日 H:i:s",$this->data['pubTime']); $res=<<<EOF <div class='comment'> <div class='face'> {$link_start} <img width='50' height='50' src="img/{$this->data['face']}.jpg" alt="" /> {$link_end} </div> <div class='username'> {$link_start} {$this->data['username']} {$link_end} </div> <div class='date' title='发布于{$dateStr}'> {$dateStr} </div> <p>{$this->data['content']}</p> </div> EOF; return $res; }查看全部
-
表单输入过滤下篇 //2.2过滤用户输入的特殊字符 public static function validate_str($str){ if(mb_strlen($str,'UTF8')<1){ //以UTF8格式获取字符串的长度获取字符串长度 return false; } //htmlspecialchars把预定义的字符转换为HTML实体,ENT_QUOTES为编码$str内的双引号和单引号 //nl2br()在字符串中的每个新行(\n)之前插入 HTML 换行符(<br> 或 <br />) $str=nl2br(htmlspecialchars($str,ENT_QUOTES)); return $str; }查看全部
-
表单输入过滤中篇 2.程序分析 //2.1检测用户输入的数据 public static function validate(&$arr){ //&为引用声明:&$arr if(!($data['email']=filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL))){ $errors['email']='请输入合法邮箱'; } if(!($data['url']=filter_input(INPUT_POST,'url',FILTER_VALIDATE_URL))){ $url=''; } //过滤函数的回调函数,函数名必须存入名为 "options" 的关联数组中 if(!($data['content']=filter_input(INPUT_POST,'content',FILTER_CALLBACK,array('options'=>'Comment::validate_str')))){ $errors['content']='请输入合法内容'; } //过滤标准的相应参数必须存入一个名为 "options" 的关联多维数组中。 $int_options=array( 'options'=>array( //FILTER_VALIDATE_INT对应参数 'min_range'=>1, //min_range - 规定最小整数值 'max_range'=>5 //max_range - 规定最大整数值 ) ); if(!($data['face']=filter_input(INPUT_POST,'face',FILTER_VALIDATE_INT,$int_options))){ $errors['face']='请选择合法头像'; } if(!empty($errors)){ $arr=$errors; return false; } $arr=$data; $arr['email']=strtolower(trim($arr['email'])); //strtolower()将字符串转换成小写 trim()去掉前后空格 return true; }查看全部
-
表单输入过滤上篇 1.php5.4起支持回调函数 1).函数做回调函数,以 string 类型传递其名称。()可以使用任何内置或用户自定义函数,但不能使用语言结构(如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset() )函数 2).一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名。 3).静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 'ClassName::methodName'。 function my_callback_function() { echo 'hello world!'; } class MyClass { static function myCallbackMethod() { echo 'Hello World!'; } } //函数做回调函数 call_user_func('my_callback_function'); //静态方法做为回调函数 call_user_func(array('MyClass', 'myCallbackMethod')); call_user_func('MyClass::myCallbackMethod'); // 对象方法做回调函数 $obj = new MyClass(); call_user_func(array($obj, 'myCallbackMethod')); filter_input()为几大过滤函数之一的:获取脚本外数据并进行字符合法化过滤函数. filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL) filter_input()参数说明:第一个参数表示调用的数据是外部通过POST方法传输过来,第二个参数表明从$_POST[email]中取得具体数据,第三个参数说明具体过滤标准,第四个参数为具体过滤标准的相应参数(可省略)查看全部
-
MYSQLi中事务处理下篇(PHP代码及其说明) 3.用php中的mysqli库实现: //先关闭自动提交功能 $mysqli->autocommit(FALSE); $sql="UPDATE account SET money=money-200 WHERE username='king'"; $res=$mysqli->query($sql); $res_affect=$mysqli->affected_rows; $sql1='UPDATE account SET money=money+200 WHERE username="queen"'; $res1=$mysqli->query($sql1); $res1_affect=$mysqli->affected_rows; if($res &&$res_affect>0 && $res1 && $res1_affect>0){ //判断是否所有语句都运行正确 $mysqli->commit(); //提交系统执行 echo '转账成功<br/>'; $mysqli->autocommit(TRUE); //回复自动提交功能 }else{ $mysqli->rollback(); //回滚到自动事务初始状态(这个函数还有$mysqli->autocommit(TRUE)的功能) echo '转账失败<br/>'; }查看全部
-
MYSQLi中事务处理上篇(事务原理与操作方法说明) 1.一个事务是一个连续的一组数据库操作只有当该组内的每个单独的操作都成功了,整个事务才执行。如果在事务的任何操作失败,则整个事务将失败。 事务有以下四个标准属性 原子性: 确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态。 一致性: 确保数据库正确地改变状态后,成功提交的事务。 隔离性: 使事务操作彼此独立的和透明的,一个事务处理后的结果,影响了其他事务,那么这个事务会撤回。 持久性: 确保提交的事务的结果或效果的系统出现故障的情况下仍然存在(软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改). 2.MYSQL的事务处理主要有两种方法(在数据库命令行下) 1).用begin,rollback,commit来实现 begin开始一个事务 rollback事务回滚 commit 事务确认 在这种方法时,当用commit确认或者rollback回滚后,事务处理功能将结束,如果要开启下一个事务,需要从新用begin开始 2).直接用set来改变mysql的自动提交模式 //mysql将每一条SQL语句当做一个事务,当输入一条SQL语句并以";"接受时系统将提交这一条SQL语句并执行 mysql默认是自动提交的,也就是你提交一个query,就直接执行!可以通过 set autocommit = 0 禁止自动提交 set autocommit = 1 开启自动提交 在这种方法时,当用commit确认或者rollback回滚后,事务处理功能将不会结束,而是同时开启了新的事务!必须用set autocommit = 1 来关闭事务功能查看全部
-
$sql="SELECT id,username,age FROM user WHERE id>=?"; $mysqli_stmt=$mysqli->prepare($sql); $id=20; $mysqli_stmt->bind_param('i',$id); if($mysqli_stmt->execute()){ //bind_result():绑定结果集中的值到变量,必须与查询结果字段一一对应 $mysqli_stmt->bind_result($id,$username,$age); //遍历结果集 //如果调用$mysqli_stmt->store_result()将数据先按照一定的格式存储,则可调用$mysqli_stmt->data_seek()来控制输出那一条记录 while($mysqli_stmt->fetch()){ echo '编号:'.$id,'<br/>'; echo '用户名:'.$username,'<br/>'; echo '年龄:'.$age.'<br/>'; echo '<hr/>'; } } $mysqli_stmt->free_result(); $mysqli_stmt->close(); $mysqli->close();查看全部
-
1.注入的解释: //如果 $name=“or 1=1#”; $pwd=md5(“123123”); $sql="select * from users where username='$name' andpassword='$pwd'"; //则以上的SQL语句会被php解析为: select * from users where username='' or 1=1#' and password=md5(‘’) 因为“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样SQL语句就变成了: select * from users where username='' or 1=1 因为1永远=1,所以where条件永远真,则结果就相当于select * from users 2.因为预定义在$mysqli_stmt=$mysqli->prepare($sql);时已经将SQL模板传递给mysql数据库并让数据库系统做语句分析,之后的传递参数将不对SQL语句做分析,所以不会出现上面所说的注入. 3.获得结果集 $mysqli_stmt->store_result(); 4.当查询语句返回的是结果集时,会因为在内存中存储结果集而占用空间,所以在之后不需要相应结果集的情况下释放结果集,回收内存空间. //释放结果集 $mysqli_stmt->free_result(); 5.关闭预处理语句 $mysqli_stmt->close();查看全部
-
1.预处理工作流程 //定义SQL语句模板(用?做为占位符) $sql="INSERT user(username,password,age) VALUES(?,?,?)"; //将查询传给mysql预处理,返回一个mysqli_stmt类对象 $mysqli_stmt=$mysqli->prepare($sql); //此时mysql会解析查询,但不会执行。 $username='king'; $password=md5('king'); $age=12; //将变量绑定到查询占位符(s代表字符串,i代表整数,d代表浮点数,b代表布尔值) $mysqli_stmt->bind_param('ssi',$username,$password,$age); //执行预处理语句 if($mysqli_stmt->execute()){ echo $mysqli_stmt->insert_id; echo '<br/>'; }else{ $mysqli_stmt->error; } //之后只用修改变量值与执行即可重复使用预处理(不需要从新在此绑定参数$mysqli_stmt->bind_param()) $username='king1'; $password=md5('king1'); $age=22; $mysqli_stmt->execute(); 2.相比于直接执行SQL语句,预处理语句有三个主要优点: 1).预处理语句大大减少了分析时间,值在$mysqli_stmt=$mysqli->prepare($sql);时mysql会分析语句. 2).绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。 3).预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。查看全部
-
执行SQL查询 建立一个数据表查看全部
-
2.设置默认的客户端编码方式 utf8查看全部
-
1.建立到MySQL的连接并打开test数据库,如果有错误显示错误信息 @ 去掉默认不显示错误信息的功能查看全部
-
mysqli类库操作数据库(下篇) 4.查看数据库对象的相关信息(可以通过属性查看,也可以通过方法查看,有些属性不一定有对应的方法可以获取到) echo '客户端的信息:'.$mysqli->client_info.’<br/>’; 或者echo $mysqli->get_client_info().’<br/>’; echo“客户端的版本:”$mysqli->cilent_version.’<br/>’; 服务器信息 $mysqli->server_info; $mysqli->get_server_info(); 5.设置字符集: $mysqli->set_charset('utf8'); 6.执行sql查询 $sql=<<<EOF //定界符 CREATE TABLE IF NOT EXISTS mysqli( id TINYINT UNSIGNED AUTO_INCREMENT KEY, username VARCHAR(20) NOT NULL); EOF; $res = $mysqli->query($sql); /* 1).SELECT/DESC/DESCRIBE/SHOW/EXPLAIN执行成功返回mysqli_result类型的对象(返回的是一个临时对象,期没有对象名,必须使用一个变量进行接收,这里的mysqli_result并不是返回对象的名称,不是变量),执行失败返回false 2).返回值可能是布尔值或者是mysqli_result对象(与mysql_query()类似,不同的是mysql_query()返回的是资源标识符[内存地址指针],对应的$mysqli->query()返回的是对象)。 */ 7.关闭连接 $mysqli->close();查看全部
-
mysqli类库操作数据库(上篇) 通过mysqli类库操作数据库步骤: 1).建立到mysql的链接 2).打开指定的数据库 3).设置默认的客户端的字符集 4).执行的sql查询 5).释放结果集 6).关闭链接 1.建立到mydql数据的链接 $mysqli = new mysqli('localhost','root','root','test’);//通过构造函数连接服务器并打开数据库,第四个参数为数据库名(此参数可以省略,之后再通过对象方法打开相应数据库) 或者$mysqli = new mysqli(); $mysqli->connect('127.0.0.1','root','root’,'test’);//通过对象方法连接服务器打开数据库,第四个参数为数据库名(此参数可以省略,之后再通过对象方法打开相应数据库) 2.打开指定的数据库 $mysqli->select_db('test'); 3.验证是否打开数据库成功 //$mysqli->connect_errno 错误编号 //$mysqli->connect_error 错误信息 if($mysqli->connect_errno){ die('connect error:'$mysqli->connect_error); }查看全部
举报
0/150
提交
取消