phparraytoquery
1. php链接请求返回值
<?php
/*
@filename abc.php
@author yanghua
how to use:
abc.php?abc=XXX(你要显示的用户)
*/
$usernames=array(0=>'aaaaa',1=>'bbbbb');//你要显示的用户必须放在这个数组中
$username=$_GET['abc'];
if(isset($username) && in_array($username,$usernames)){
echo $username."是本站用户";
}
?>
问题出在两行 $conn = mysql_connect($server,$username,$password) or die ($couldNotConnectMysql);
mysql_select_db($database,$conn) or die ($couldNotOpenDatabase);,问题可能出现在你的,$username,$password,$database变量里边
.最有可能是你的mysql的密码不为123造成的,要么把MySQL里的密码改为123,要么把$password改为你mysql里的密码。
3. PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗
举例,首先看了pymysql里面的cursor类,关于execute、fetchone和fetchall定义如下:
#调用self._query方法进行查询
def execute(self, query, args=None):
"""Execute a query
:param str query: Query to execute.
:param args: parameters used with query. (optional)
:type args: tuple, list or dict
:return: Number of affected rows
:rtype: int
If args is a list or tuple, %s can be used as a placeholder in the query.
If args is a dict, %(name)s can be used as a placeholder in the query.
"""
while self.nextset():
pass
query = self.mogrify(query, args)
result = self._query(query)
self._executed = query
return result
#调用_do_get_result获取查询结果
def _query(self, q):
conn = self._get_db()
self._last_executed = q
self._clear_result()
conn.query(q)
self._do_get_result()
return self.rowcount
#这里获取结果
def _do_get_result(self):
conn = self._get_db()
self._result = result = conn._result
self.rowcount = result.affected_rows
self.description = result.description
self.lastrowid = result.insert_id
self._rows = result.rows
self._warnings_handled = False
if not self._defer_warnings:
self._show_warnings()
其实看到这里代码逻辑已经很清楚了,在调用cursor.execute执行SQL的时候,就将MySQL查询的结果放到result这个变量里了,也就是说结果集放到了客户端的内存变量里,那么获取数据的方式也就是从这个内存变量里去获取数据,只是获取的行为有所不同而已了。
def fetchone(self):
"""Fetch the next row"""
self._check_executed()
if self._rows is None or self.rownumber >= len(self._rows):
return None
result = self._rows[self.rownumber]
self.rownumber += 1
return result
def fetchmany(self, size=None):
"""Fetch several rows"""
self._check_executed()
if self._rows is None:
return ()
end = self.rownumber + (size or self.arraysize)
result = self._rows[self.rownumber:end]
self.rownumber = min(end, len(self._rows))
return result
def fetchall(self):
"""Fetch all the rows"""
self._check_executed()
if self._rows is None:
return ()
if self.rownumber:
result = self._rows[self.rownumber:]
else:
result = self._rows
self.rownumber = len(self._rows)
return result
口说无凭,我们直接通过Wireshark抓包来证明一下,首先我在本地执行脚本如下,然后我监听本地的网卡流量
import pymysql
conn = pymysql.connect(host='xxx', port=3306,
user='xucl', password='xuclxucl', database='xucl')
cursor = conn.cursor()
cursor.execute("select * from t")
注意,我这里并没有执行fetch操作,如果监听到的包里面包含了结果,那么就证明我们前面的分析是正确的,话不多说开始实验,Wireshark抓包如下:
果然跟我们之前的预测是一致的,即使没有进行fetch操作,MySQL也将结果集发送到客户端了。另外关于结果集发送,可以参考我另外一篇文章:《由一个抓瞎的SQL引申出去》
结论:
客户端执行SQL的时候,MySQL一次性将结果集发送给了客户端
客户端接收到结果集以后存储本地内存变量中
fetch结果只是从这个本地变量中获取,fetchone/fetchmany/fetchall只是获取行为的不通,因此对于MySQL来说并没有什么不通的。
4. 如何使用PHP向数据库中插入图片,,并且使得图片可以显示在页面上
一般不向数据库插入图片 而是插入图片的src 通过src找到图片然后显示。
<?php
session_start();
//array数组中放图片的格式
$uptypes = array("image/jpg","image/jpeg","image/png","image/pjpeg","image/gif","image/bmp","image/x-png");
$files =$_FILES["uppic"];
if($files["size"]>2097152){ //图片大小判断
echo "上传图片不能大于2M";
echo "<meta http-equiv='REFRESH' CONTENT='1;URL=pic.php'>";
exit;
}
$ftype =$files["type"];
if(!in_array($ftype,$uptypes)){ //图片格式判断
echo "上传的图片文件格式不正确";
echo "<meta http-equiv='REFRESH' CONTENT='1;URL=pic.php'>";
}
$fname = $files["tmp_name"]; //在服务器临时存储名称
$image_info = getimagesize($fname);
$name = $files["name"];
$str_name = pathinfo($name); //以数组的形式返回文件路劲的信息
$extname = strtolower($str_name["extension"]); //把字符串改为小写 extensiorn扩展名
$upload_dir = "upload/"; //upload文件夹
$file_name = date("YmdHis").rand(1000,9999).".".$extname;
$str_file = $upload_dir.$file_name; //文件目录
//存入数据库
$con=mysql_connect("localhost","root","");
if(!$con){
die(("数据库连接失败").mysql_error());
}
mysql_select_db("mywork",$con);
$sql="update user set picpath='$str_file' where user_name='$username'"; //将图片地址插入数据库mywork
mysql_query($sql,$con);
mysql_close($con);
if(!file_exists($upload_dir)){
mkdir($upload_dir); //创建目录 成功则返回true 失败则返回flase
}
if(!move_uploaded_file($files["tmp_name"],$str_file)){ //将上传的文件移动到新的目录 要移动文件 和文件新目录 成功则返回true
echo "图片上传失败";
echo "<meta http-equiv='REFRESH' CONTENT='1;URL=插入失败后希望跳转的页面>";
}
else{
//echo "<img src=".$str_file.">";
echo "图片上传成功";
echo "<meta http-equiv='REFRESH' CONTENT='1;URL=插入成功希望挑战的页面>";
}
5. php 中$result为什么会有属性num_rows属性
num_rows 是原生mysql中的mysql_num_rows() 函数,用来返回结果集中行的数目.
而你这里的num_rows 是被封装成mysql类了,具体你要去看你程序里的mysql类是怎么使用的.
而你给出的代码也很明显
$num_cats=@$result->num_rows;
if($num_cats==0){
returnfalse;
}
自定义变量$num_cats= 等于 num_rows返回的数目
那么接下来就一个判断
如果返回的数目等于0那么 返回false false=假
$result=db_result_to_array($result);
resutn $result;
最后这里返回的应该是一个数组 db_result_to_array()
6. php 参数传递问题($_GET('id'))
while($row=mysql_fetch_array($query)){
?>
<a href=ceshi2.php?id=<?=$row['id']?> ><?=$row['user']?></a>
<?
}
本来就只会出现最后一个,因为它循环到最后就是最后一个
写成
ceshi.php
<?
include("conn.php");
$SQL="SELECT * FROM message order by id desc";
$query=mysql_query($SQL);
$arr = array();
while($row = mssql_fetch_array($query)){
$arr[]=$row;
}
$len=count($arr);
for($i=0;$i<$len;$i++){
echo"<a href=ceshi2.php?id=<?=$arr[$i]['id‘]?> ><?=$arr[$i][’user‘]?></a>";
}
?>
ceshi2.php
<?php
include("conn.php");
$SQL="select * from message where id=".$_GET['id'];
$query=mysql_query($SQL);
while($row = mssql_fetch_array($query)){
$arr[]=$row;
}
print_r($arr);
?>
7. PHP 采集程序中常用的函数
复制代码
代码如下:
//获得当前的脚本网址
function
get_php_url()
{
if(!empty($_SERVER[”REQUEST_URI”]))
{
$scriptName
=
$_SERVER[”REQUEST_URI”];
$nowurl
=
$scriptName;
}
else
{
$scriptName
=
$_SERVER[”PHP_SELF”];
if(empty($_SERVER[”QUERY_STRING”]))
$nowurl
=
$scriptName;
else
$nowurl
=
$scriptName.”?”.$_SERVER[”QUERY_STRING”];
}
return
$nowurl;
}
//把全角数字转为半角数字
function
GetAlabNum($fnum)
{
$nums
=
array(”0”,”1”,”2”,”3”,”4”,”5”,”6”,”7”,”8”,”9”);
$fnums
=
“0123456789″;
for($i=0;$i<=9;$i++)
$fnum
=
str_replace($nums[$i],$fnums[$i],$fnum);
$fnum
=
ereg_replace(”[^0-9\.]|^0{1,}”,””,$fnum);
if($fnum==””)
$fnum=0;
return
$fnum;
}
//去除HTML标记
function
Text2Html($txt)
{
$txt
=
str_replace(”
“,””,$txt);
$txt
=
str_replace(”<”,”<”,$txt);
$txt
=
str_replace(”>”,”>”,$txt);
$txt
=
preg_replace(”/[\r\n]{1,}/isU”,”<br/>\r\n”,$txt);
return
$txt;
}
//清除HTML标记
function
ClearHtml($str)
{
$str
=
str_replace('<','<',$str);
$str
=
str_replace('>','>',$str);
return
$str;
}
//相对路径转化成绝对路径
function
relative_to_absolute($content,
$feed_url)
{
preg_match('/(http|https|ftp):\/\//',
$feed_url,
$protocol);
$server_url
=
preg_replace(”/(http|https|ftp|news):\/\//”,
“”,
$feed_url);
$server_url
=
preg_replace(”/\/.*/”,
“”,
$server_url);
if
($server_url
==
”)
{
return
$content;
}
if
(isset($protocol[0]))
{
$new_content
=
preg_replace('/href=”\//',
‘href=”‘.$protocol[0].$server_url.'/',
$content);
$new_content
=
preg_replace('/src=”\//',
'src=”‘.$protocol[0].$server_url.'/',
$new_content);
}
else
{
$new_content
=
$content;
}
return
$new_content;
}
//取得所有链接
function
get_all_url($code){
preg_match_all('/<a\s+href=[”|\']?([^>”\'
]+)[”|\']?\s*[^>]*>([^>]+)<\/a>/i',$code,$arr);
return
array('name'=>$arr[2],'url'=>$arr[1]);
}
//获取指定标记中的内容
function
get_tag_data($str,
$start,
$end)
{
if
(
$start
==
”
||
$end
==
”
)
{
return;
}
$str
=
explode($start,
$str);
$str
=
explode($end,
$str[1]);
return
$str[0];
}
//HTML表格的每行转为CSV格式数组
function
get_tr_array($table)
{
$table
=
preg_replace(”‘<td[^>]*?>'si”,'”‘,$table);
$table
=
str_replace(”</td>”,'”,',$table);
$table
=
str_replace(”</tr>”,”{tr}”,$table);
//去掉
HTML
标记
$table
=
preg_replace(”‘<[\/\!]*?[^<>]*?>'si”,””,$table);
//去掉空白字符
$table
=
preg_replace(”‘([\r\n])[\s]+'”,””,$table);
$table
=
str_replace(”
“,””,$table);
$table
=
str_replace(”
“,””,$table);
$table
=
explode(”,{tr}”,$table);
array_pop($table);
return
$table;
}
//将HTML表格的每行每列转为数组,采集表格数据
function
get_td_array($table)
{
$table
=
preg_replace(”‘<table[^>]*?>'si”,””,$table);
$table
=
preg_replace(”‘<tr[^>]*?>'si”,””,$table);
$table
=
preg_replace(”‘<td[^>]*?>'si”,””,$table);
$table
=
str_replace(”</tr>”,”{tr}”,$table);
$table
=
str_replace(”</td>”,”{td}”,$table);
//去掉
HTML
标记
$table
=
preg_replace(”‘<[\/\!]*?[^<>]*?>'si”,””,$table);
//去掉空白字符
$table
=
preg_replace(”‘([\r\n])[\s]+'”,””,$table);
$table
=
str_replace(”
“,””,$table);
$table
=
str_replace(”
“,””,$table);
$table
=
explode('{tr}',
$table);
array_pop($table);
foreach
($table
as
$key=>$tr)
{
$td
=
explode('{td}',
$tr);
array_pop($td);
$td_array[]
=
$td;
}
return
$td_array;
}
//返回字符串中的所有单词
$distinct=true
去除重复
function
split_en_str($str,$distinct=true)
{
preg_match_all('/([a-zA-Z]+)/',$str,$match);
if
($distinct
==
true)
{
$match[1]
=
array_unique($match[1]);
}
sort($match[1]);
return
$match[1];
}