闹鬼!php字符串数组交叉

WBOY
发布: 2016-08-04 09:20:08
原创
1010 人浏览过

<code>$where = '1=1';
$keyword = $_GET['keyword'];
        
if($keyword) {
    $where['title'] = array('like', "%$keyword%");
}

var_dump($where);

竟然打印出来:A=1

到底是怎么样的转换流程?</code>
登录后复制
登录后复制

回复内容:

<code>$where = '1=1';
$keyword = $_GET['keyword'];
        
if($keyword) {
    $where['title'] = array('like', "%$keyword%");
}

var_dump($where);

竟然打印出来:A=1

到底是怎么样的转换流程?</code>
登录后复制
登录后复制

首先,让我来吐槽一下(不吐槽会死!):

  1. $where是一个字符串,你写的$where['title']是个什么鬼?

  2. 你把一个array赋值给一个字符串中的一个字符串,这又是什么鬼?

我把你问题中的一些杂七杂八无用的代码去除后,精简一下问题:

<code>$where = '1=1';
$where['title'] = array();
var_dump($where);</code>
登录后复制

和上面的吐槽对应的是,我们也一步步来看:
$where['title']表达的是字符串$where中下标为'title'的字符,注意下标的合法值是[0-字符串长度减1],那么php对于非法的下标,实际上是和$where[0]的作用是一致的。
这样问题进一步简化为:

<code>$where = '1=1';
$where[0] = array();
var_dump($where);</code>
登录后复制

了解了$where[0]实际上指的是$where字符串的第一个字符,那么下面就是要吐槽的“你把一个array赋值给一个字符串中的一个字符串,这又是什么鬼?
我们下面做一个测试:

<code>var_dump( (string)array() );</code>
登录后复制

你猜会输出什么?

<code>PHP Notice:  Array to string conversion in /home/nfer/temp.php on line 8
string(5) "Array"</code>
登录后复制

那么这里就很好理解了,$where[0] = array();就是把字符串Array赋值给$where字符串的第一个字符。
bingo, the output is string(3) "A=1"

最后,让我也写一个闹鬼的代码:

<code>$where = 'A=1';
$keyword = $_GET['keyword'];
        
if($keyword) {
    $where['title'] = $keyword == 123;
}

var_dump($where);</code>
登录后复制

你觉得结果会输出什么呢?

1.$where = 1,这个没错把,首先这个是字符串。
2.然后你又把$where当数组,并把$where['title'] = array('like',"xxx"),赋值过去,这不科学把。

相关标签:
php
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!