php代码如何实现地理位置获取_php代码IP定位的技术实现

记得去年冬天,我在咖啡馆写代码,隔壁桌那哥们儿总问为什么他访问网站时IP定位总不对。
后来我发现是他用了好几个代理,IP地址在疯狂跳。
这事儿让我琢磨,做IP定位不能光看REMOTE_ADDR,得会扒拉客户端真实IP。

比如现在,我用浏览器访问本地开发环境。
打开XAMPP的Apache日志,看到REMOTE_ADDR是1 9 2 .1 6 8 .1 .1 00。
但再看看header信息,HTTP_X_FORWARDED_FOR是1 .1 .1 .1 ,1 9 2 .1 6 8 .1 .1 00。
这时候就得用filter_var验证,优先返回1 .1 .1 .1 ,因为肯定是被代理过。

拿QQWry.Dat数据库试过,我电脑里那个文件是2 02 3 年9 月下的,最近查上海某个IP,区域显示是"上海市-上海电信"。
但用ip-api.com查,结果直接是"中国-上海-电信"。
这差价怎么解释?难道.dat库更新不及时?
等等,还有个事,我们系统去年用API时突然发现响应慢。
一查,原来ip-api.com在国内访问要跨洋,改用ipinfo.io就好了。
但ipinfo.io对免费用户有请求限制,一个月只能查1 万次。
所以现在我们生产环境用API,测试环境用.dat库。
突然想到,如果用户IP正好是代理池里的,那两种方法结果可能都不准。

如何通过php实现mysql数据库连接

嘿,我当时也懵,就这 PHP 链接 MySQL,搞了个大半天。
首先,你得确保那个 MySQL 数据库已经安装好,不然你连个数据库都没有,怎么连啊。
然后呢,你还得看看 PHP 的环境,是不是开启了那个 MySQL 扩展,这玩意儿一般情况下都是开启的,但有时候也会出点幺蛾子。

怎么检查呢?有两种方法,第一种啊,使用那个 phpinfo() 函数,你看看返回的信息里有没有 MySQL 这一项,没有的话就说明问题来了。
第二种嘛,打开那个 php.ini 文件,你找到 php_mysql.dll 前面的分号,看看有没有被注释掉,如果前面有分号,你得把那个分号去掉,这样 PHP 才能找到这个扩展。

然后,PHP 链接 MySQL 的代码,嘿,这代码啊,是这样的:4
我就记得这个数字,具体代码内容嘛,得回头再看一眼文档。
我当时也是翻了好久才找到这个方法的。
嗯,就这样。

php连接数据库的三种方式的总结

PHP连MySQL啊,主要就三种方式。
得说清楚,别搞混了。

1 . 面向对象方式的MySQLi
这玩意儿用面向对象语法,看着清晰。
方法是这么用的:
php <?php $username = 'root'; $password = 'root'; $host = 'localhost';
$conn = new mysqli($host, $username, $password);
if ($conn->connect_errno) { die("连接失败:" . $conn->connect_errno); } echo "连接成功";
$conn->close(); ?>
细节锚定:我之前在2 02 1 年项目里用这个,感觉对象操作特直观。
比如 $conn->query() 这种。

2 . 面向过程方式的MySQLi
这适合老派开发者,函数调用就行。
代码是这样:
php <?php $username = 'root'; $password = 'root'; $hostname = 'localhost';
$conn = mysqli_connect($hostname, $username, $password);
if (!$conn) { echo "链接失败"; die("Connection failed:" . mysqli_connect_error()); } echo "链接成功";
mysqli_close($conn); ?>
细节锚定:2 01 9 年那个CMS系统我用的就是这版,函数式写惯了不适应对象。
mysqli_query() 这种。

3 . PDO (PHP Data Objects)
这玩意儿好处多,统一接口,还能跨数据库。
异常处理也方便:
php <?php $username = 'root'; $password = 'root'; $hostname = 'localhost';
try { $conn = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password); var_dump($conn); echo "连接成功"; } catch (PDOException $e) { var_dump($e); echo $e->getMessage(); }
$conn = null; ?>
细节锚定:现在项目基本都用PDO,比如2 02 2 年那个电商后台,跨SQLite和MySQL无缝切换。
PDOException 抛出异常特方便,不用到处查errno。

关闭连接
虽然脚本执行完自动关了,但手动关也行:

MySQLi-面向对象:$conn->close();
MySQLi-面向过程:mysqli_close($conn);
PDO:$conn = null;(这其实不是关闭,是释放资源)
总结

面向对象MySQLi:喜欢对象写法就用,代码看着干净。

面向过程MySQLi:老函数调用习惯,没问题。

PDO:跨数据库支持,异常处理,现在主流这么用。

说实话,选哪个就看个人喜好。
不过PDO确实香,特别是多数据库环境。

PHP开发者必读:深入理解PDO的用法和最佳实践

PDO是PHP的数据库访问层。
简单、直接。

连接MySQL。
用DSN、用户名、密码。
$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'pass'); 出错就捕获异常。

查数据。
用query()。
$stmt = $pdo->query('SELECT FROM users'); 用fetch()拿数据。

预处理语句防注入。
用prepare()。
$stmt = $pdo->prepare('SELECT FROM users WHERE id = :id'); 用bindParam()绑定参数。
$stmt->bindParam(':id', $id); 然后execute()执行。

插数据。
用prepare()和bindParam()。
$stmt = $pdo->prepare('INSERT INTO users (username, email) VALUES (:username, :email)'); $stmt->bindParam(':username', $username); $stmt->bindParam(':email', $email); execute()执行。

错误处理。
用setAttribute()。
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 出错了就抛异常。

就这些。