PHP视频教程之PHP搜索附近的人实现代码
- 格式:doc
- 大小:35.00 KB
- 文档页数:3
利⽤PHP获取访客IP、地区位置、浏览器及来源页⾯等信息前⾔本⽂中主要介绍了关于利⽤PHP获取访客IP、地区位置、浏览器及来源页⾯等信息的相关内容,分享出来供⼤家参考学习,下⾯来⼀起看看详细的介绍:不多说了,每个⽅法都注释了,可以直接⽤:⽰例代码<?php//这个类似⽤来获取访客信息的//⽅便统计class visitorInfo{//获取访客ippublic function getIp(){$ip=false;if(!empty($_SERVER["HTTP_CLIENT_IP"])){$ip = $_SERVER["HTTP_CLIENT_IP"];}if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }for ($i = 0; $i < count($ips); $i++) {if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {$ip = $ips[$i];break;}}}return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);}//根据ip获取城市、⽹络运营商等信息public function findCityByIp($ip){$data = file_get_contents('/service/getIpInfo.php?ip='.$ip);return json_decode($data,$assoc=true);}//获取⽤户浏览器类型public function getBrowser(){$agent=$_SERVER["HTTP_USER_AGENT"];if(strpos($agent,'MSIE')!==false || strpos($agent,'rv:11.0')) //ie11判断return "ie";else if(strpos($agent,'Firefox')!==false)return "firefox";else if(strpos($agent,'Chrome')!==false)return "chrome";else if(strpos($agent,'Opera')!==false)return 'opera';else if((strpos($agent,'Chrome')==false)&&strpos($agent,'Safari')!==false)return 'safari';elsereturn 'unknown';}//获取⽹站来源public function getFromPage(){return $_SERVER['HTTP_REFERER'];}}总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
phpcms搜索功能随着互联网的发展和信息爆炸的时代,人们对于信息的获取变得越来越迫切。
作为网站开发者,提供一个高效的搜索功能对于用户来说是至关重要的。
在本文中,我们将介绍如何使用Phpcms搭建一个强大的搜索功能。
Phpcms是一款基于PHP开发的开源内容管理系统。
它不仅提供了搭建网站的基本功能,还提供了丰富的插件和模块,包括搜索功能。
下面我们将以一个新闻网站为例,介绍如何使用Phpcms实现搜索功能。
首先,在Phpcms后台进入“系统管理”-“模型管理”,点击“添加模型”,输入模型的名称和表名,点击“下一步”进入模型字段设置。
在这里,我们需要添加一些字段,比如新闻标题、新闻内容、发布时间等。
这些字段将用于搜索结果的展示。
在模型设置完成后,返回模型管理页面,点击“添加内容”,输入新闻的标题、内容等信息,点击“保存”即可添加新闻。
接下来,我们需要在网站前台添加搜索框并处理搜索请求。
在Phpcms的模板中,我们可以使用以下代码添加搜索框:````<form action="" method="get"><input type="text" name="keyword" placeholder="请输入关键字"><input type="submit" value="搜索"></form>````在用户提交搜索请求后,我们可以通过以下代码处理搜索请求并展示搜索结果:````<?php$keyword = isset($_GET['keyword']) ? $_GET['keyword'] : '';if(!empty($keyword)) {// 进行关键字匹配搜索$where = "title like '%$keyword%' or content like'%$keyword%'";$news = phpcms_model('news')->select($where);// 展示搜索结果foreach($news as $item) {echo "<h2>{$item['title']}</h2>";echo "<p>{$item['content']}</p>";}}>````以上代码首先获取用户输入的关键字,并进行模糊匹配搜索。
PHP实现简单搜索功能⽅案:问答搜索1. 搜索结果列表,⾼亮显⽰搜索关键词内容2. ⽤户输⼊内容,点击搜索2.1 获取⽤户的搜索内容;2.2 调⽤分词服务,获取对搜索内容的分词;2.3 先查询是否已经存在这些关键词内容的缓存,有则直接取结果;否,进⾏下⼀步;2.4 如果 2.2 返回的分词数⼤于 5 个,则取 5 个关键词的问答帖⼦交集,判断数量是否 >= 30 条;不够,则逐次丢弃最后的关键词,再次进⾏查询,直到关键词的个数减到只有 1 个为⽌;2.4.1 对 2.4 中的多次结果进⾏去从,以及进⾏帖⼦的权重计算(问答帖⼦的质量计算:Q = α * T + β * S + γ * A , α = 0.2 , β = 0.5 , γ = 0.3 ;T - 时间; S - 点赞数 ; A - 回答数;T = (当前的时间秒戳 - 帖⼦的发帖时间) / 7*86400;)2.5 将 2.4 中的问答结果写⼊ Redis ,10 分钟失效;(key - hnb:qa:search_result , 帖⼦)2.6 读取 2.5 Redis 结果,展⽰到页⾯// 问答搜索public function getQuestionBySearch($arr_keyWords , $arr_keyWeight , $start , $num){$arr_temple_keyWords = $arr_keyWords;count($arr_keyWords) > 8 ? $len = 8 : $len = count($arr_keyWords);// redis 中的 key 值$key = 'hnb:qa:search:qa_score:' . implode('_' , array_splice($arr_temple_keyWords , 0 , $len));// 读取 redis 中 key = hnb-search:'关键词',... 有没有缓存.$exists = Hnb_Model_Qa_Question_Cache::getInstance()->existsKey($key);if($exists){$arr_questionInfo = unserialize($exists);} else {$arr_questionInfo = array();$arr_question_ids = array();$arr_label_in_question = array();do{$arr_keyWords = array_splice($arr_keyWords , 0 , $len--);$arr_result = Hnb_Model_Qa_Question_Cache::getInstance()->getSearchRelativeQuestion($arr_keyWords , $start , $num);// 问答帖⼦foreach($arr_result as$question){// 去掉重复的问答if(!in_array($question['id'] , $arr_question_ids)){$arr_question_ids[] = $question['id'];// 权重计算$question['score'] = pow(2 , $len);$this->_logicQaWeight($question , $arr_keyWords , $arr_keyWeight);$arr_questionInfo[] = $question;}}} while((count($arr_questionInfo) < 100) && $len);// 存在数据时if($arr_questionInfo){// 权重排序//uasort($arr_questionInfo , array($this , 'cmp'));usort($arr_questionInfo , array($this , 'cmp'));// 保存临时数据//Hnb_Model_Qa_Question_Cache::getInstance()->saveTempleData($key , $arr_questionInfo , $timeOutSecond = 600);// 设定该临时数据的失效时间}}return$arr_questionInfo;}// 按帖⼦的权重排序private function cmp($a , $b){if($a['score'] == $b['score']){return 0;}return ($a['score'] > $b['score']) ? -1 : 1;}// 问答帖⼦的权重计算逻辑private function _logicQaWeight(&$questionInfo , $arr_keyWords , $arr_keyWeight){$a = 0.2; // 发帖时间$b = 0.5; // 点赞数$c = 0.3; // 回复数//$d = ..; // 匹配度因⼦$b = $c = 0;$timeLine = 30 * 86400; //$minus = time() - $questionInfo['create_time'];// 向下取整$t = floor($minus / $timeLine);$tParam = 2 * pow(0.5 , $t);// ⽤户回答$user_answers = Hnb_Model_Qa_Answer::getInstance()->getAnswerInfoByQuestion($questionInfo['id']);// 顾问回答权重计算if($user_answers){is_string($user_answers) ? $user_answers = unserialize($user_answers) : '';$praise_num = null;foreach($user_answers as$answer){$praise_num += $answer['praise_num'];}} else {$praise_num = 0;}// 匹配度因⼦计算$this->_matchingQARate($questionInfo , $arr_keyWords , $arr_keyWeight);$weight = $a * $tParam + $b * $praise_num + $c * $questionInfo['answer_num'];$questionInfo['all_praise_num'] = $praise_num;$questionInfo['keywords'] = implode(',' , $arr_keyWords);$questionInfo['params'] = '时间-' . ($a * $tParam) . '##tParam-' . $tParam. '## 点赞数-' . ($b * $praise_num) . '## 回复数-' . ($c * $questionInfo['answer_num']);$questionInfo['score'] = $questionInfo['score'] + $weight;//print_r($questionInfo);}// 帖⼦的匹配度public function _matchingQARate(&$questionInfo , $arr_keyWords , $arr_keyWeight){// 1. 发送搜索内容到分词服务$arr_kwIntersect_result = array_intersect($arr_keyWords , $questionInfo['keyword']);echo '交集';print_r($arr_kwIntersect_result);// 2. 获取到返回的分词与权重$arr_format_wordInfo = Hnb_Model_Search::getInstance()->formatWordInfo($questionInfo['keyword2']);// 帖⼦关键词的权重,注意次序$w = array();foreach($arr_format_wordInfo as$wordInfo){if(in_array($wordInfo['keyword'] , $arr_kwIntersect_result)){$w[] = $wordInfo['weight'];}}// 搜索内容分词的权重,注意次序$y = array();foreach($arr_keyWeight as$weightInfo){if(in_array($weightInfo['keyword'] , $arr_kwIntersect_result)) {$y[] = $weightInfo['weight'];}}print_r($w);echo '<br />';print_r($y);echo '###############';$element = null;foreach($w as$key => $v){$element += $v * $y[$key];}echo$element;// 3. 与搜索出来的帖⼦做交集// 4. 计算帖⼦的匹配度/** 计算公式:* 3 中的交集作为分⼦* 3 中的帖⼦与 2 的分词权重*/}。
使⽤PHP实现查找附近的⼈LBS(基于位置的服务)查找附近的⼈有个更⼤的专有名词叫做LBS(基于位置的服务),LBS是指是指通过电信移动运营商的⽆线电通讯⽹络或外部定位⽅式,获取移动终端⽤户的位置信息,在GIS平台的⽀持下,为⽤户提供相应服务的⼀种增值业务。
因此⾸先得获取⽤户的位置,获取⽤户的位置有基于GPS、基于运营商基站、WIFI等⽅式,⼀般由客户端获取⽤户位置的经纬度坐标上传⾄应⽤服务器,应⽤服务器对⽤户坐标进⾏保存,客户端获取附近的⼈数据的时候,应⽤服务器基于请求⼈的地理位置配合⼀定的条件(距离,性别,活跃时间等)去数据库进⾏筛选和排序。
根据经纬度如何得出两点之间的距离?我们都知道平⾯坐标内的两点坐标可以使⽤平⾯坐标距离公式来计算,但经纬度是利⽤三度空间的球⾯来定义地球上的空间的球⾯坐标系统,假定地球是正球体,关于球⾯距离计算公式如下:具体推断过程有兴趣的推荐这篇⽂章:PHP函数代码如下:/*** 根据两点间的经纬度计算距离* @param $lat1* @param $lng1* @param $lat2* @param $lng2* @return float*/public static function getDistance($lat1, $lng1, $lat2, $lng2){$earthRadius = 6367000; //approximate radius of earth in meters$lat1 = ($lat1 * pi() ) / 180;$lng1 = ($lng1 * pi() ) / 180;$lat2 = ($lat2 * pi() ) / 180;$lng2 = ($lng2 * pi() ) / 180;$calcLongitude = $lng2 - $lng1;$calcLatitude = $lat2 - $lat1;$stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);$stepTwo = 2 * asin(min(1, sqrt($stepOne)));$calculatedDistance = $earthRadius * $stepTwo;return round($calculatedDistance);}MySQL代码如下:SELECTid, (3959 * acos (cos ( radians(78.3232) )* cos( radians( lat ) )* cos( radians( lng ) - radians(65.3234) )+ sin ( radians(78.3232) )* sin( radians( lat ) ))) AS distanceFROM markersHAVING distance < 30ORDER BY distanceLIMIT 0 , 20;除了上⾯通过计算球⾯距离公式来获取,我们可以使⽤某些数据库服务得到,⽐如Redis和MongoDB:Redis 3.2提供GEO地理位置功能,不仅可以获取两个位置之间的距离,获取指定位置范围内的地理信息位置集合也很简单。
php站内搜索并⾼亮显⽰关键字的实现代码复制代码代码如下:<?phprequire_once 'sqlTools.class.php';//封装类,可执⾏dql、dml语句$info=$_POST['info'];$sql="select name,password,email from user_500 where name like '%$info%' or password like '%$info%' or email like '%$info%'";$sqlTools=new SqlTools();$res=$sqlTools->execute_dql($sql);while ($row=mysql_fetch_assoc($res)){$row['name']=preg_replace("/($info)/i","<b style=\"color:red\">\\1</b>",$row['name']);$row['password']=preg_replace("/($info)/i","<b style=\"color:red\">\\1</b>",$row['password']);$row['email']=preg_replace("/($info)/i","<b style=\"color:red\">\\1</b>",$row['email']);echo $row['name']."-->".$row['password']."-->".$row['email']."<br>";}>思路分析:将sql语句中包含的%$info%交给DBMS执⾏的时候,他会查找字段中含有变量$info的值的信息,%$info--->查找以$info的值结束的信息$info%--->查找以$info的值开头的信息通过正则函数preg_replace()将搜索到的关键字⾼亮显⽰,⽐如, $row['name']=preg_replace("/($info)/i","<b style=\"color:red\">\\1</b>",$row['name']); 的意思是:通过POST⽅接收到的值$info替换为加上样式(红⾊加粗)的结果,并将结果重新赋给$row[‘name']如果要搜索多个关键字的话,可以对接收到值$info进⾏分割,⽐如$info_more=explode(" ",$info);//这种⽅式能对以空格隔开的关键字进⾏分割,再对分割后的结果挨个进⾏查询,同样,可以使⽤正则表达式函数进⾏替换⼯作,以⾼亮显⽰关键字sqlTools.class.php的源代码:复制代码代码如下:<?phpclass SqlTools{private $host="localhost";private $dbname="test";private $dbuser="root";private $dbpwd="";private $conn;public function __construct(){$this->conn=mysql_connect($this->host,$this->dbuser,$this->dbpwd);if(!$this->conn){die("连接数据库失败".mysql_error());}mysql_select_db($this->dbname,$this->conn) or die("找不到该数据库".mysql_error());mysql_query("set names utf8");}public function execute_dml($sql){$bool=mysql_query($sql);if ($bool){if ($bool>0) {return 1;}else{return 2;}}else {return 0;}}public function execute_dql($sql){$res=mysql_query($sql);return $res;}public function close_conn(){ mysql_close($this->conn); }}>原创⽂章:WEB开发_⼩飞。
在PHP中,要获取当前位置的经纬度坐标,可以使用以下代码方法之一:1. 使用IP地理位置数据库:通过查询IP地理位置数据库,可以获取当前用户所在的经纬度坐标。
在PHP中,可以使用第三方库(如IP地理位置数据库查询库)或自行编写代码进行查询。
以下是一个简单的示例代码:```php<?phpfunction getCoordinates() {// 定义IP地理位置数据库查询库的路径$database = 'path/to/ip-geolocation-database.php';// 获取当前用户的IP地址$ip = $_SERVER['REMOTE_ADDR'];// 包含IP地理位置数据库查询库include($database);// 查询IP地址对应的经纬度坐标$coordinates = ip_geolocation_get_coordinates($ip);// 返回经纬度坐标return $coordinates;}// 获取当前位置坐标并输出$coordinates = getCoordinates();echo '经度:' . $coordinates['longitude'] . '<br>';echo '纬度:' . $coordinates['latitude'] . '<br>';>```请注意,这种方法只能获取到粗略的地理位置坐标,精度可能不够高。
2. 使用浏览器地理位置API:如果你的应用程序是在Web浏览器中运行,并且用户已经授权获取地理位置信息,你可以使用浏览器地理位置API来获取当前位置的经纬度坐标。
以下是一个简单的示例代码:```php<?php// 检查浏览器地理位置API是否可用if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(?:Chrome\/|Edge\/|Firefox\/|Safari\/)\d+/',$_SERVER['HTTP_USER_AGENT'])) {// 使用JavaScript获取地理位置坐标并将数据发送到服务器echo '<script>navigator.geolocation.getCurrentPosition(function(position) {var lat = titude;var lon = position.coords.longitude;document.getElementById("latlon").innerHTML = "经度:" + lon + "<br>纬度:" + lat;}, function(error) {document.getElementById("latlon").innerHTML = "无法获取地理位置:" + error.message;});</script>';} else {echo '此浏览器不支持地理位置API。
php 搜索功能PHP搜索功能追求高效、准确的搜索功能对于许多网站和应用程序来说都是至关重要的。
PHP是一种流行的服务器端编程语言,具备强大的搜索功能。
下面将介绍一些使用PHP实现搜索功能的方法。
一、全文搜索全文搜索是一种广泛应用于数据库和文本文档中的搜索方法,它根据关键字检索文本内容。
在PHP中,可以使用MySQL数据库的全文索引功能来实现全文搜索。
首先,在数据库表中创建全文索引,然后使用MATCH和AGAINST语句进行搜索。
这种方法提供了较快的搜索速度和准确的搜索结果。
二、模糊搜索有时候用户在搜索时可能只记得关键词的一部分或存在拼写错误,这就需要使用模糊搜索。
PHP提供了多种模糊搜索方法,包括LIKE、REGEXP、Soundex和Levenshtein等。
LIKE语句可以根据关键词的一部分来搜索,并使用通配符进行匹配。
而REGEXP语句则可以使用正则表达式进行更复杂的模糊搜索。
三、过滤搜索过滤搜索是根据某些条件来过滤搜索结果,使结果更加准确。
PHP中可以使用各种条件语句(如WHERE)和运算符(如AND、OR)来实现过滤搜索。
例如,可以根据日期、价格、地理位置等条件来过滤搜索结果。
这种方法可以提供更具体的搜索结果,满足用户的特定需求。
四、分类搜索分类搜索是将搜索结果按照特定的类别进行分类,以方便用户更加快速地找到所需的信息。
在PHP中,可以使用数组、关联数组或数据库表来实现分类搜索。
例如,可以将商品按照价格区间、品牌、颜色等分类,并根据用户选择的分类条件来展示相应的搜索结果。
五、排序搜索排序搜索是根据某些条件对搜索结果进行排序,使用户更容易找到他们想要的内容。
在PHP中,可以使用ORDER BY语句对搜索结果进行排序。
例如,可以根据日期、价格、评分等条件对搜索结果进行排序,以提供更加合理的搜索结果。
总结PHP拥有强大的搜索功能,可以通过全文搜索、模糊搜索、过滤搜索、分类搜索和排序搜索等方法来实现准确、高效的搜索功能。
Php简单站内搜索代码一,设计搜索表单在网站的根目录下建个search.htm,内容如下<html><head><title>搜索表单</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head> <body bgcolor="#FFFFFF" text="#000000"><form name="form1" method="post" action="search.php"><table width="100%" cellspacing="0" cellpadding="0"><tr><td width="36%"><div align="center"><input type="text" name="keyword"></td><td width="64%"><input type="submit" name="Submit" value="搜索"></td></tr></table></form></body></html>二,搜索程序再在根目录下建个search.php 的文件,用来处理search.htm表单传过来的数据.内容如下<?php//获取搜索关键字$keyword=trim($_POST[“keyword”]);//检查是否为空if($keyword==””){echo”您要搜索的关键字不能为空”;exit;//结束程序}?>这样如果访问者输入的关键字为空时,可以做出提示。
PHPMYSQL搜索周边坐标,并计算两个点之间的距离搜索附近地点,例如,坐标(39.91, 116.37)附近500⽶内的⼈,⾸先算出“给定坐标附近500⽶”这个范围的坐标范围。
虽然它是个圆,但我们可以先求出该圆的外接正⽅形,然后拿正⽅形的经纬度范围去搜索数据库。
红⾊部分为要求的搜索范围,绿⾊部分为实际搜索范围。
/*** 获取周围坐标* Enter description here ...* @param unknown_type $lng 固定坐标经度* @param unknown_type $lat 固定坐标纬度* @param unknown_type $distance 搜索周边距离,单位KM* @return multitype:multitype:number*/function returnSquarePoint($lng, $lat,$distance = 1){$earthRadius = 6378.138; //地球半径,单位KM$dlng = 2 * asin(sin($distance / (2 * $earthRadius)) / cos(deg2rad($lat)));$dlng = rad2deg($dlng);$dlat = $distance/$earthRadius;$dlat = rad2deg($dlat);return array('left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng));//使⽤此函数计算得到结果后,带⼊sql查询。
php搜索功能在开发一个网站或应用程序时,搜索功能是一个非常重要的功能。
它允许用户根据关键字或条件快速找到他们需要的信息。
搜索功能在电子商务网站、社交媒体平台、博客网站等各种网站和应用程序中被广泛使用。
在PHP中,实现搜索功能可以通过各种方法来完成。
以下是一些常见的搜索功能实现方法:1. 基于数据库查询:这是最常用的方法之一。
你可以使用SQL查询语句在数据库中进行搜索。
根据用户输入的关键字,你可以编写一个SQL查询来匹配数据库中的记录。
例如,如果你想在一个电子商务网站上实现商品搜索功能,你可以编写一个查询来根据商品名称、描述、价格等字段进行匹配。
2. 基于全文搜索引擎:全文搜索引擎是一种专门设计用于高效搜索大量文本数据的工具。
在PHP中,你可以使用Elasticsearch、Solr、Lucene等全文搜索引擎来实现搜索功能。
这些搜索引擎提供了强大的搜索和排序功能,并且通常比数据库搜索更快。
3. 基于关键字索引:如果你的数据集不是很大,你可以使用关键字索引来实现搜索功能。
你可以使用PHP中的字符串函数,如strpos()、stripos()等来搜索关键字,并返回匹配的结果。
这种方法相对简单,适用于小型应用程序或网站。
无论你采用哪种方法实现搜索功能,都应该考虑以下几个方面:1. 用户界面:搜索功能的用户界面应该简单明了,使用户能够快速输入关键字并进行搜索。
你可以使用HTML和CSS来创建一个漂亮的搜索框和搜索按钮。
2. 搜索结果展示:搜索功能应该返回与用户搜索条件匹配的结果。
你可以使用PHP来处理搜索请求,并将结果呈现给用户。
你可以使用HTML和CSS来创建一个漂亮的搜索结果页面。
3. 搜索引擎优化:搜索功能的目的是让用户能够找到他们需要的信息。
因此,你应该优化搜索功能,使其能够返回相关的、准确的结果。
你可以使用相关度算法来确定搜索结果的排序,并使用词干提取、去停用词等技术来提高搜索准确性。
4. 性能优化:搜索功能可能需要处理大量的数据。
1,获取经纬度注意有3中经纬度的表示方法经纬度以度数表示,一般可直接以小数点表示,但亦可把度数的小数点分为角分(1角分等于六十分之一度),和秒(一秒等于六十分之一分)。
表示经纬度有多样模式,以下是其中一些例子。
度分秒表示(度:分:秒)-49°30'00"-123d30m00s度分表示(度:分)-49°30.0'-123d30.0m度数表示-49.5000°-123.5000d(一般会有四位小数)。
这里的经纬度是用度数表示的,在有些公式的计算中,是需要把角度转换为弧度的,注意他们的转换经纬度转换的函数:deg2rad —将角度转换为弧度rad2deg() - 将弧度数转换为相应的角度数2,数据库中存储经纬度保存类型float(10,6)创建MySQL 表时,您应当特别注意lat 和lng 属性。
鉴于Google Maps 目前的缩放能力,您只需要精确到小数点后六位数。
为了让表占用的存储空间降至最低,您可以将lat 和lng 属性指定为大小是(10,6) 的浮点数。
这样,这些字段将会存储小数点后6 位数以及小数点前最多4 位数,如-123.456789 度。
3,实现算法(基于一定范围内)在庞大的地理数据库中搜索地点,索引是很重要的。
但是,我们的需求是搜索附近地点,例如,坐标(39.91, 116.37)附近500米内有什么地点?搜索条件是地点坐标与当前坐标之间的距离,显然是无法应用索引的。
那么换个思路:首先算出“给定坐标附近500米”这个范围的坐标范围。
虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围去搜索数据库。
先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。
红色部分为要求的搜索范围,绿色部分我们能间接得到的结果范围参考wiki 百科上的一些球面计算公式:∙Great-circle distance ∙ H aversine formula假设已知点的经纬度分别为$lng, $lat先实现经度范围的查询,在haversin 公式中令φ1 = φ2,可得:用PHP 进行计算,就是:Example123 //$lat已知点的纬度 $dlng = 2 * asin(sin($distance / (2 * EARTH_RADIUS)) /cos (deg2rad ($lat ))); $dlng = rad2deg($dlng );//转换弧度然后是纬度范围的查询,在haversin 公式中令 Δλ = 0,可得在PHP 中进行计算,就是:Example12 $dlat =$distance /EARTH_RADIUS;//EARTH_RADIUS 地球半径 $dlat = rad2deg($dlat );//转换弧度在lat 和lng 列上建立索引,能从一定程度上提高范围查询的效率。
PHP记录搜索引擎爬行记录的实现代码本篇文章小编主要和大家分享一下PHP记录搜索引擎爬行记录的实现代码,文章中会有代码列出供大家参考学习,对PHP开发感兴趣的小伙伴就随小编一起来了解一下吧。
下面是完整代码://记录搜索引擎爬行记录 $searchbot = get_naps_bot();if ($searchbot){ $tlc_thispage = addslashes($_SERVER['HTTP_USER_AGENT']);$url = $_SERVER['HTTP_REFERER'];$file = WEB_PATH.'robotslogs.txt';$date = date('Y-m-d H:i:s');$data = fopen($file,'a');fwrite($data,"Time:$date robot:$searchbot URL:$tlc_thispage/r/n"); fclose($data);}WEB_PATH为index.PHP下define的根目录路径,意思就是说robotslogs.txt文件是放在根目录下的。
通过get_naps_bot()获取蜘蛛爬行记录,然后在通过addslashes处理一下,将数据存储于变量$tlc_thispage中。
fopen打开robotslogs.txt文件,将数据通过函数fwrite写入,在通过函数fclose关闭就可以了。
因为我觉得没必要,所以把自己网站上的代码删除了,所以也没有效果示例了。
PS:php获取各搜索蜘蛛爬行记录的代码支持如下的搜索引擎:Baidu,Google,Bing,Yahoo,Soso,Sogou,Yodao爬行网站的记录!代码:<?php/*** 获取搜索引擎爬行记录* edit by */function get_naps_bot(){$useragent = strtolower($_SERVER['HTTP_USER_AGENT']);if (strpos($useragent, 'googlebot') !== false){return 'Google';}if (strpos($useragent, 'baiduspider') !== false){return 'Baidu';}if (strpos($useragent, 'msnbot') !== false){return 'Bing';}if (strpos($useragent, 'slurp') !== false){return 'Yahoo';}if (strpos($useragent, 'sosospider') !== false){return 'Soso';}if (strpos($useragent, 'sogou spider') !== false){return 'Sogou';}if (strpos($useragent, 'yodaobot') !== false){return 'Yodao';}return false;}function nowtime(){$date=date("Y-m-d.G:i:s");return $date;}$searchbot = get_naps_bot();if ($searchbot) {$tlc_thispage = addslashes($_SERVER['HTTP_USER_AGENT']); $url=$_SERVER['HTTP_REFERER'];$file=".txt";$time=nowtime();$data=fopen($file,"a");fwrite($data,"Time:$time robot:$searchbot URL:$tlc_thispage\n"); fclose($data);}?>以上就是小编给大家分享的PHP记录搜索引擎爬行记录的实现代码,希望对小伙伴们有所帮助,想要了解更多内容的小伙伴可以登录扣丁学堂官网咨询。
PHP搜索分词实现代码<?php/*** @author: xiaojiang 2014-01-08* php 建⽴分词树* */class Tree{public$w = '';public$subT = array();public$isEnd = false;public function __construct($w= '' , $isEnd = false){if(!empty($w)){$this->w = $w;$this->isEnd = $isEnd;}}public function insert( $str ){$len = strlen($str);if(!$len) return ;$scope = $this;for( $i = 0; $i< $len; $i++ ){//判断汉字$cStr = $str[$i];if( ord( $cStr ) > 127 ){$cStr = substr($str, $i, 3);$i += 2;}$scope = $scope->insertNode( $cStr );}$scope->isEnd = true;}private function &insertNode( $w ){$t = $this->hasTree( $w );if( !$t ){$t = new Tree( $w );array_push($this->subT, $t );}return$t;}public function &hasTree($w){foreach ($this->subT as$t){if($t->w == $w)return$t;}return false;}}class myStr{private$str = '';private$arr = array();private$len = 0;public function __construct( $str){$this->str = $str;$len = strlen($str);for ($i = 0; $i < $len; $i++ ){$cStr = $str[$i];if(ord($cStr) > 127){$cStr = substr($str, $i , 3);$i += 2;}array_push($this->arr, $cStr);}$this->len = count($this->arr);}public function getIndex( $idx ){return$this->arr[$idx];}public function getLength(){return$this->len;}}$tIns = new Tree();$tIns->insert('中华');$tIns->insert('⼈民');$tIns->insert('共和国');$tIns->insert('baidu');$strIns = new myStr("cc中华的⼈民共和国和中国啊啊"); for ($i = 0; $i < $strIns->getLength(); $i++ ){$j = $i;$curW = $strIns->getIndex($i);$stIns = $tIns->hasTree( $curW );if(!$stIns) continue;$sw = '';while ( $stIns ){$sw .= $stIns->w;$_isEnd = $stIns->isEnd;$stIns = $stIns->hasTree( $strIns->getIndex( ++$j ) );if( !$stIns && !$_isEnd)$sw = '';}if($sw)echo$sw."<br>";}>输出:中华⼈民共和国baidu。
PHP搜索查询功能实现今天遇到⼀个问题:在做“搜索”功能时,输⼊查询条件后查询不了。
我做的是⾸页显⽰数据表package中的内容,但是有个条件,显⽰在⾸页的内容还必须是:字段status=0,且printing=0的数据才能在⾸页列表中显⽰出来。
页⾯上有⼀个“搜索”功能,输⼊条件后就会根据条件来进⾏查询。
⼀般的搜索的话,只要在⾸页显⽰列表⽅法index()中给⼀个:$map=array();//初始化查询条件$map=$this->_search();//调⽤查询⽅法$total = $this->Model->where ($map)->count(); //这个主要是⽤来计算页⾯显⽰数据条数的if ($total == 0) {$_list = '';} else {$_list = $this->Model->where ($map)->limit( $post_data ['first'] . ',' . $post_data ['rows'] )->select();}然后,就是写⼀个_search():如:protected function _search(){$map = array ();$post_data = I ( 'post.' );if ($post_data ['packageid'] != '') {$map ['packageid'] = array ('like','%' . $post_data ['packageid'] . '%');}return $map;}最后,在设置的“搜索”菜单中,调⽤这个搜索⽅法。
但是,我做的这个,搜索的同时,还要确保在字段status=0,且printing=0的数据中进⾏搜索。
php 定位代码在PHP中,定位代码可以通过多种方式实现,具体取决于你想要定位的内容。
以下是一些常见的方法:1. 定位特定行数:```php$lines = file('filename.php'); // 读取文件的所有行并存储到数组中$targetLine = 5; // 目标行数$start = ($targetLine - 1) * 5; // 计算开始位置,这里假设每行长度为5个字符$end = $start + 5; // 计算结束位置$code = ''; // 存储目标代码的变量for ($i = $start; $i <= $end; $i++) {if (isset($lines[$i])) {$code .= $lines[$i]; // 将目标行的代码拼接到$code变量中}}echo $code; // 输出目标代码```2. 定位特定关键字:```php$code = file_get_contents('filename.php'); // 读取整个文件内容$keyword = 'function'; // 目标关键字$start = strpos($code, $keyword); // 查找关键字的起始位置$end = strrpos($code, $keyword); // 查找关键字的结束位置if ($start !== false && $end !== false) {$code = substr($code, $start, ($end - $start +strlen($keyword))); // 截取目标代码块echo $code; // 输出目标代码} else {echo '关键字未找到';}```这些示例代码可以帮助你定位PHP代码中的特定行数或关键字。
PHPMYSQL搜索周边坐标并计算两个点之间的距离在PHP和MySQL中周边坐标并计算两个点之间的距离,可以使用地理坐标系和距离计算公式来实现。
首先,我们需要一个存储地理坐标的数据库表。
创建一个名为locations 的表,包含以下字段:```sqlCREATE TABLE locationsid INT PRIMARY KEY AUTO_INCREMENT,latitude DECIMAL(10,8) NOT NULL,longitude DECIMAL(11,8) NOT NULL```在这个表中,latitude 和 longitude 分别用于存储纬度和经度信息。
接下来,我们需要一个函数来计算两个点之间的距离。
可以使用Haversine 公式来计算球面上两个点之间的距离。
下面是一个示例函数:```phpfunction distance($lat1, $lon1, $lat2, $lon2)$earthRadius = 6371; // 地球半径(单位:千米)$dLat = deg2rad($lat2 - $lat1);$dLon = deg2rad($lon2 - $lon1);$a = sin($dLat / 2) * sin($dLat / 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon / 2) * sin($dLon / 2);$c = 2 * atan2(sqrt($a), sqrt(1 - $a));$distance = $earthRadius * $c;return $distance;```该函数将四个参数作为输入值,即两个点的纬度和经度。
它使用Haversine 公式将球面上两个点之间的距离计算出来,并返回这个距离值。
现在,我们可以编写一个PHP脚本在MySQL中周边的坐标,并计算两个点之间的距离了。
PHP视频教程之PHP搜索附近的人实现代码
搜索附近的人这项功能对我们来说已经不在陌生了,那么搜索附近的人怎么用PHP实现呢?本篇文章小编就带读者们来了解一下PHP搜索附近的人如何用代码实现。
本文实例为大家分享PHP实现搜索附近的人具体代码,供大家参考,具体内容如下。
实现思路:
首先,我们应该这样想:既然我们知道了用户当前位置的经纬度,又知道我们将要搜索的范围,我们可不可以计算出一个范围?也就是说,根据一个中心点和半径,计算出符合条件的经纬度的最大值和最小值。
具体实现:
那么到此,想要独立思考完成的小伙伴可以不要继续往下看了。
上面我们提到该功能的一个实现原理,接下来我们就讲解一下具体的实现步骤。
我们先声明一个函数,用作计算经纬度的范围:
/**
* 根据经纬度和半径计算出范围
* @param string $lat 纬度
* @param String $lng 经度
* @param float $radius 半径
* @return Array 范围数组
*/
private function calcScope($lat, $lng, $radius) {
$degree = (24901*1609)/360.0;
$dpmLat = 1/$degree;
$radiusLat = $dpmLat*$radius;
$minLat = $lat - $radiusLat; // 最小纬度
$maxLat = $lat + $radiusLat; // 最大纬度
$mpdLng = $degree*cos($lat * (PI/180));
$dpmLng = 1 / $mpdLng;
$radiusLng = $dpmLng*$radius;
$minLng = $lng - $radiusLng; // 最小经度
$maxLng = $lng + $radiusLng; // 最大经度
/** 返回范围数组 */
$scope = array(
'minLat' => $minLat,
'maxLat' => $maxLat,
'minLng' => $minLng,
'maxLng' => $maxLng
);
return $scope;
}
返回的数组中包含了在$radius 范围内,符合条件的最大最小经纬度。
既然我们已经获取到了范围,那么我们就可以开始从数据库中查找所有在这个经纬度范围内符合条件的记录:
/**
* 根据经纬度和半径查询在此范围内的所有的电站
* @param String $lat 纬度
* @param String $lng 经度
* @param float $radius 半径
* @return Array 计算出来的结果
*/
public function searchByLatAndLng($lat, $lng, $radius) {
$scope = $this->calcScope($lat, $lng, $radius); // 调用范围计算函数,获取最大最小经纬度
/** 查询经纬度在 $radius 范围内的电站的详细地址 */
$sql = 'SELECT `字段` FROM `表名` WHERE `Latitude` <
'.$scope['maxLat'].' and `Latitude` > '.$scope['minLat'].' and
`Longitude` < '.$scope['maxLng'].' and `Longitude` > '.$scope['minLng'];
$stmt = self::$db->query($sql);
$res = $stmt->fetchAll(PDO::FETCH_ASSOC); // 获取查询结果并返回 return $res;
}
扩展:
直到现在,我们已经知道了如何计算出附近的人,但在实际需求中,我们往往需要计算出每一个人与当前中心点的实际距离。
接着,我们再来看一个方法:
/**
* 获取两个经纬度之间的距离
* @param string $lat1 纬一
* @param String $lng1 经一
* @param String $lat2 纬二
* @param String $lng2 经二
* @return float 返回两点之间的距离
*/
public function calcDistance($lat1, $lng1, $lat2, $lng2) {
/** 转换数据类型为 double */
$lat1 = doubleval($lat1);
$lng1 = doubleval($lng1);
$lat2 = doubleval($lat2);
$lng2 = doubleval($lng2);
/** 以下算法是 Google 出来的,与大多数经纬度计算工具结果一致 */
$theta = $lng1 - $lng2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
return ($miles * 1.609344);
}
以上就是小编为大家简单分享的搜索附近的人怎么用PHP实现,希望对小伙伴们有所帮助,想要了解更多内容的小伙伴可以登录扣丁学堂官网咨询。