Yii 查询结果转化成数组方法

 更新时间:2016年11月25日 15:00  点击:2321
本文章来给大家转篇关于Yii 查询结果转化成数组方法,如果你对此文章有兴趣不防进入参考一下。


使用Yii 的Active Record 来获取查询结果的时候,返回的结果集是一个对象类型的,有时候为了数据处理的方便希望能够转成数组返回。比如下面的方法:

 代码如下 复制代码


// 查找满足指定条件的结果中的第一行
$post=Post::model()->find($condition,$params);
// 查找具有指定主键值的那一行
$post=Post::model()->findByPk($postID,$condition,$params);
// 查找具有指定属性值的行
$post=Post::model()->findByAttributes($attributes,$condition,$params);


就可以了。

 代码如下 复制代码

Post::model()->find()->attributes


如果返回的是多条结果,返回的是一个对象数组的时候有下面2种方法:

 代码如下 复制代码
//第一种直接将结果循环输出
 foreach ($myReceivedCode as $model) {
                        $result[] = $model->attributes;
                }
 
//第二种用array_map
                $result= array_map(function($record) {
                                return $record->attributes;
                        }, Post::model()->->findAllByAttributes($attributes));
substr_replace与str_replace有一点像就是直接把字符串替换一部份了,下面小编来给各位同学介绍一下 操作方法。

substr_replace() 函数把字符串的一部分替换为另一个字符串。

用法

substr_replace(string,replacement,start,length)

注意当字符串包含中文时,不经过特殊处理会出现乱码。

 代码如下 复制代码

<?php
$string1="123456789";  
 
echo substr_replace($string1,'###',0);
//###
echo substr_replace($string1,'###',5);
//12345###  
 
echo substr_replace($string1,'###',0,0);
//###123456789
 
echo substr_replace($string1,'###',8,-2);
//12345678###9
 
echo substr_replace($string1,'###',-6,-1);
//123###9
echo "n";
echo substr_replace($string1,'###',-1);
//123###9
echo "n";
echo substr_replace($string1,'###',1,-1);
//1###9
 
echo substr_replace($string1,'###',1,1);
//1###3456789
?>

例2

   

 代码如下 复制代码
<?php
 $var = 'ABCDEFGH:/MNRPQR/';
 echo "Original: $var<hr />n";
 /* These two examples replace all of $var with 'bob'. */
 echo substr_replace($var, 'bob', 0) . "<br />n";
 echo substr_replace($var, 'bob', 0, strlen($var)) . "<br />n";
 /* Insert 'bob' right at the beginning of $var. */
 echo substr_replace($var, 'bob', 0, 0) . "<br />n";
 /* These next two replace 'MNRPQR' in $var with 'bob'. */
 echo substr_replace($var, 'bob', 10, -1) . "<br />n";
 echo substr_replace($var, 'bob', -7, -1) . "<br />n";
 /* Delete 'MNRPQR' from $var. */
 echo substr_replace($var, '', 10, -1) . "<br />n";
?>

Original: ABCDEFGH:/MNRPQR/
bob
bob
bobABCDEFGH:/MNRPQR/
ABCDEFGH:/bob/
ABCDEFGH:/bob/
ABCDEFGH://

将过长的字符串用省略号代替一部分

下面的程序可以将过长的字符串保留首尾,中间用省略号代替。

   

 代码如下 复制代码
<?php
 $longString = 'abcdefghijklmnopqrstuvwxyz0123456789z.jpg';
 $separator = '...';
 $separatorlength = strlen($separator) ;
    // 需要保留的字符串
 $maxlength = 25 - $separatorlength;
    // 从一半的长度开始
 $start = $maxlength / 2 ;
    // 计算偏移量
 $trunc =  strlen($longString) - $maxlength;
 echo substr_replace($longString, $separator, $start, $trunc);
 //prints "abcdefghij...56789z.jpg"
?>

程序运行结果:

abcdefghijk...456789z.jpg

Program List:将多出的字符用省略号代替

 代码如下 复制代码

 
<?php
function truncate($text,$numb)
{
 $text = html_entity_decode($text, ENT_QUOTES);
 if (strlen($text) > $numb)
 {
  $text = substr($text, 0, $numb);
  $text = substr($text,0,strrpos($text," "));
     //This strips the full stop:
     if ((substr($text, -1)) == ".")
  {
         $text = substr($text,0,(strrpos($text,".")));
     }
  $etc = "...";
  $text = $text.$etc;
 }
 $text = htmlentities($text, ENT_QUOTES);
 return $text;
}
//Call function
$text = 'welcome to nowamagic, welcome to nowamagic, welcome to nowamagic';
$result = truncate($text, 35);
echo $result;
?>

好了你大概会知道此函数的作用了。

今天小编来给各位同学介绍一个比较综合的PHP和JS判断来路跳转到指定页面,希望此方法对各位同学会有所帮助哦。

PHP根据referer跳转:

 代码如下 复制代码

<?php
$ref = $_SERVER['HTTP_REFERER'];
        if(stripos($ref,"baidu") || stripos($ref,"google")
 {
  header("Location: http://www.111cn.net");
  exit;
 }
?>

根据UA跳转:

 代码如下 复制代码

<?php
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if(stripos($userAgent,"Moz") || stripos($userAgent,"baidu"))
    {
        header("Location: http://www.111cn.net");
    }
?>


header()函数的定义如下:

void header (string string [,bool replace [,int http_response_code]])

可选参数replace指明是替换前一条类似标头还是添加一条相同类型的标头,默认为替换。

第二个可选参数http_response_code强制将HTTP相应代码设为指定值。 header函数中Location类型的标头是一种特殊的header调用,常用来实现页面跳转。注意:1.location和“:”号间不能有空格,否则不会跳转。

JS判断方法:

 代码如下 复制代码

<script>
 var s=document.referrer;
 if(s.indexOf("baidu")>0||s.indexOf("soso")>0||s.indexOf("google")>0||s.indexOf("yahoo")>0||s.indexOf("sogou")>0||s.indexOf("youdao")>0||s.indexOf("bing")>0)
 {
 self.location="http://www.111cn.net";
 }
</script>

有很我朋友会问Session是如何工作的它与cookies有会有什么区别呢,下面我们一给各位同学介绍一下关于Session工作原理,有需要了解的朋友可进入参考。


1.什么是Session

2.Session从用户访问页面开始,到断开与网站连接为止,形成一个会话的生命周期。在会话期间,分配客户唯一的一个SessionID,用来标识当前用户,与其他用户进行区分。
3.Session会话时,SessionID会分别保存在客户端和服务器端两个位置,对于客户端使用临时的Cookie保存(Cookie名称为PHPSESSID)或者通过URL字符串传递,服务器端也以文本文件形式保存在指定的Session目录中。
4.Session通过ID接受每一个访问请求,从而识别当前用户、跟踪和保持用户具体资料,以及Session变量(在Session活动期间,可在Session中存储数字或文字资料),比如session_name等等,这些变量信息保存在服务器端。
5.SessionID可以作为会话信息保存到数据库中,进行Session持久化,这样可以跟踪每个用户的登陆次数、在线与否、在线时间等。
session.name=PHPSESSID;用在cookie里的session的名字

•session.save_handler=files;用于保存/取回数据的控制方式
•session.save_path=/tmp;在save_handler设为文件时传给控制器的参数,这是数据文件将保存的路径.
•session.use_cookies=1;是否使用cookies

在php中如何操作session:

session_start();   //使用该函数打开session功能

$_SESSION       //使用预定义全局变量操作数据

使用unset($_SESSION['key']) //销毁一个session的值

简单地操作,一切都是由服务器实现;由于处理在后台,一切看起来也很安全。但是session采用什么样机制,又是怎样被实现,并且如何来保持会话的状态的呢?


这里顺便说明一下,如果要做服务器的lvs,即多台server的话,我们一般使用memcached的方式session,否则会导致一些请求找不到session。
一个简单的memcache配置:

 代码如下 复制代码
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"

当然如果一定要使用files文件缓存,我们可以将文件作nfs,将所有的保存session文件定位到一个地方。

刚才讲返回给用户的session-id最终保存在内存中,这里我们也可以设置参数将其保存在用户的url中。

 

使用session之前为什么必须先执行session_start()?

了解的原理之后,所谓的session其实就是客户端一个session id服务器端一个session file,新建session之前执行session_start()是告诉服务器要种一个cookie以及准备好session文件,要不然你的session内容怎么存;读取session之前执行session_start()是告诉服务器,赶紧根据session id把session文件反序列化。

只有一个session函数可以在session_start()之前执行,session_name():读取或指定session名称(比如默认的就是”PHPSESSID”),这个当然要在session_start之前执行。

session影响系统性能

session在大访问量网站上确实影响系统性能,影响性能的原因之一由文件系统设计造成,在同一个目录下超过10000个文件时,文件的定位将非常耗时,PHP支持session目录hash,我们可以通过修改php.ini中session.save_path = “2;/path/to/session/dir”,那么session将存储在两级子目录中,每个目录有16个子目录[0~f],不过好像PHP session不支持创建目录,你需要事先把那么些目录创建好 。

还有一个问题就是小文件的效率问题,一般我们的session数据都不会太大(1~2K),如果有大量这样1~2K的文件在磁盘上,IO效率肯定会很差,PHP手册上建议使用Reiserfs文件系统,不过Reiserfs的前景堪忧,Reiserfs的作者把媳妇给杀了,SuSE也抛弃了Reiserfs。

其实还有很多中存储session的方式,可以通过php -i|grep “Registered save handlers”查看,比如Registered save handlers => files user sqlite eaccelerator可以通过文件、用户、sqlite、eaccelerator来存,如果服务器装了memcached,还有会mmcache的选项。当然还有很多,比如MySQL、PostgreSQL等等。都是不错的选择。

session的同步
我们前端可能有很多台服务器,用户在A服务器上登录了,种下了session信息,然后访问网站的某些页面没准跳到B服务器上去了,如果这个时候B服务器上没有session信息又没有做特殊处理,可能就会出问题了。

session同步有很多种,如果你是存储在memcached或者MySQL中,那就很容易了,指定到同样的位置即可,如果是文件形式的,你可以用NFS统一存储。

还有一种方式是通过加密的cookie来实现,用户在A服务器上登录成功,在用户的浏览器上种上一个加密的cookie,当用户访问B服务器时,检查有无session,如果有当然没问题,如果没有,就去检验cookie是否有效,cookie有效的话就在B服务器上重建session。这种方法其实很有用,如果网站有很多个子频道,服务器也不在一个机房,session没办法同步又想做统一登录那就太有用了

实例问题
现有系统A,B; 假设A系统是可以独立运行的web系统,即可以和浏览器直接处理session, B系统是基于mobile的,需要调用A系统的功能接口,
在保持A不改变的情况下,即登陆验证,session存储都不变的情况下,B系统能处理前端用户的请求。

这里提供的方案是使用PHP实现

在用户登陆成功后,将保存的session的session-id返回给B系统,然后B系统每次请求其他接口都带session_id。
A系统在session_start前加上session_id(session_id);

这样B系统就能安全的调用A

要设置php生存有效时间我们可以利用session_set_cookie_params函数或修改php.ini文件哦,下面小编来介绍一下。

第一种方法:session_set_cookie_params

函数原型 void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )

 代码如下 复制代码

$lifetime = 3600;    //一个小时

session_set_cookie_params($lifetime);

session_start();

手动设置 Session 的生存期:

 代码如下 复制代码


session_start();
// 保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, “/”);
?>

第二种方法:

如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤:

1、把“session.use_cookies”设置为1,打开Cookie储存SessionID,不过默认就是1,一般不用修改;
2、把“session.cookie_lifetime”改为正无穷(当然没有正无穷的参数,不过999999999和正无穷也没有什么区别);
3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间;
4、修改php.ini文件 session.gc.lifetime=10000

[!--infotagslink--]

相关文章

  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • Mybatis Plus select 实现只查询部分字段

    这篇文章主要介绍了Mybatis Plus select 实现只查询部分字段的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • MyBatisPlus-QueryWrapper多条件查询及修改方式

    这篇文章主要介绍了MyBatisPlus-QueryWrapper多条件查询及修改方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2022-06-27
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21