layout: post
title: "php手机归属地查询Demo"
date: 2016-05-18 22:37:17 +0800
comments: true
categories: [php]
看了视频过后准备自己撸一个PHP的手机归属地查询。这个Demo的思路和方法其实算不上难。但是这个Demo作者使用了框架的思维并且用到了SPL等知识。以前没有写过这样的代码,所以决定自己写一次。
下面具体说说这个Demo中遇到的一些问题。
SPL-AutoLoad
在使用SPL的autoload时,借助以前的Spl的代码来实际使用,发现在实际的项目中老是出现无法加载的情况。
先把具体代码贴出来
<?php
use app\MobileQuery;
spl_autoload_extensions();
set_include_path(get_include_path().PATH_SEPARATOR."libs/".PATH_SEPARATOR."app/");
spl_autoload_register();
?>
<?php libs/mypdo.php
namespace libs;
use \PDO;
class mypdo
{
}
如上,当我将libs/mypdo.php命名为MyPdo.php时,在实例化mypdo就会发生不能加载的情况,而如果命名成小写就没有问题。
原因如下:
<pre class="prettyprint linenums">
WINDOWS大小写不敏感,而在LINUX下区分大小写,
spl_autoload会把类名转化为小写进行文件搜索,
这样就造成linux下无法正常include文件.
解决办法:
1.索性把被包含文件改成小写;
2.扫目录得到文件列表,然后遍历列表去匹配出正确文件名,包含之。
</pre>
PHP内存不够
这个其实问题是出在对命名空间理解不透彻。
之前在使用PDO的时候为了方便,直接将自定义的PDO操作类命名为PDO.php并且在构造函数中实例化PDO对象。
<?php
namespace libs;
use \PDO;
class PDO
{
public function __construct()
{
try {
$this->db = new PDO("mysql:host=".$this->db_host.";dbname=".$this->db_name,$this->db_user,$this->db_pass);
$this->db->exec("SET CHARACTER SET".$this->db_charset);
$this->db->exec("SET NAMES".$this->db_charset);
} catch (PDOException $e) {
print "Error!:".$e->getMessage()."<br>";
die();
}
}
}
?>
一直报错,PHP每次不够,改了很多次php.ini都没用。后来突然发现是我在new PDO的时候它实际上是new的自己本身,造成了一个死循环。
后来将类名改成mypdo后发现找不到PDO。
原来是我这里用了命名空间的概念,如果想用PDO需要在前面加入
use \PDO;
```。
**MySQL删除json_encode()出来的\**
在将数据保存到数据库后,在读数据时不能```json_decode```对应的中文。
后来发现是在存入数据库时,中文编码出来的```\```被删除了。
```php
{"a":"\u232e234\e23"}//json_encode的结果
{"a":"u232e234e23"}//存到数据库的结果
解决方法:
在外层调用一下函数addslashes();这个函数会在每个反斜杠的前面添加反斜杠,如此这般就可以存进数据库了。
$info = addslashes(json_encode($review_log));//这样处理后存进数据库就不回丢失“\"
最后我将这个Demo放到了GitHub:https://github.com/EwanReton/PhpPhoneLocation