$_PUT?put数据获取

我们经常使用$_GET和$_POST来进行服务器交互,但是我们有的时候不得不被逼使用$_PUT方法获取数据
当然,php中是没有$_PUT的,但是我们可以使用 $_SERVER[‘REQUEST_METHOD’]来判断,因为我们这个服务器变量会是PUT
这样我们十一哦那个parse_str就可以分割开put的变量
put.php页面代码
$_PUT = array();
if (‘PUT’ == $_SERVER[‘REQUEST_METHOD’]) {
parse_str(file_get_contents(‘php://input’), $_PUT);
}
print_r($_PUT);
其中:parse_str() 函数把查询字符串解析到变量中。
而我们如何知道自己的$_PUT能用吗?
linux命令行下执行:
curl -X PUT http://localhost/put.php -d “id=12” -d “title=内容为中文”
显示:
Array
(
[id] => 12
[title] => 内容为中文
)
附:put再也不怕了~

 

jquery特殊字符问题处理

问题:今天项目上有个地方使用
$(“#lamp”).load(‘/admin/checklogin.php?sid=’+sid);
这样传递的时候遇到空格就直接参数就丢失
后经查询资料发现可以使用encodeURIComponent(这里有三个函数可以对html进行编码,具体可以自行查找资料)解决问题;但是问题就又来了,如果传递内容过多呢?不能用get了!查询Jquery资料看到文档中有这样一句话:
默认使用 GET 方式 – 传递附加参数时自动转换为 POST 方式。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 “url #some > selector”。
也就是说:load也可以使用post方法传递,我就修改了两个地方代码即可
$(“#lamp”).load(‘/admin/checklogin.php’,{sid:sid});
这样我接收参数就得使用$_POST[‘sid’]

附:尽量使用ajax使用post,当然不管你用$.post()或者$.load()也好,总之post数据会对一部分html元字符进行编码(个人喜欢$.post())

if和else匹配问题以及switch问题

$b = 1;
$a = 2;
if ($a > 1) {
echo ‘1’;
if ($b > 2) {
echo ‘2’;
}
} else {
echo ‘3’;
}

这样的代码是很规范的,但是,如果你不带{}的括号,你执行之后显示的结果会让你很纠结的~~我认为else匹配最近的一个if,问题就在这里!原来不带{}的时候会这样子滴。

然后说一个switch问题的比较问题

$a = 5;
switch ($a) {
case $a > 3:
echo ‘大于3’;
break;
case $a == 3:
echo ‘等于3’;
break;
case $a < 3:
echo ‘小于3’;
break;
}

然后我们把$a = 5改成$a = 0;然后会看到~~(你先想想)

结果竟然是!!大于3!!

然后我们再做点调整再$a = 5改成$a = 2.0,这样我们就会看到~~唉,还是你自己写出来看看吧

其实有的时候结果是和你想像的不一样的~~注意Swtich的语法

PS:工作原理:首先设置表达式 n(通常是一个变量)。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配,则与该 case 关联的代码块会被执行。请使用 break 来阻止代码自动地向下一个 case 运行。

也就是说switch中的case是确定的值而不是进行比较的值!很好玩吧?

Sqlite使用说明

安装apt-get install slqite

.databases List names and files of attached databases(列出数据库名称和数据库文件)
“.datebasae” 命令显示所有当前连接打开的数据库的一个列表。将允许一次到少两个。第一个是“main”,最初打开的那个数据库。第二个是”temp”,用于临时表的数 据库。对于用ATTACH语句附加的数据也许有附加数据库列表。输出的第一列与之相联的数据库名,第二列是外部文件名。
.schema ?TABLE? Show the CREATE statements(.schema 显示所有的表的创建语句;.schema tableX 显示表tableX的创建语句.)
.exit Exit this program(退出sqlite管理)
.tables ?PATTERN? List names of tables matching a pattern(.tables 显示数据库中所有的表.)
.dump ?TABLE? … Dump the database in a text format(打包数据库命令)
.echo ON|OFF Turn command echo on or off
.explain ON|OFF Turn output mode suitable for EXPLAIN on or off(”.explain”命令可以被用来设 置输出格式为“column” 并设置列宽为EXPLAIN命令看起来比较合理的宽度)
.header(s) ON|OFF Turn display of headers on or off(出现在输出开头两行的列标示可以用”.header”点命令关闭)
.help Show this message(显示帮助信息)
.indices TABLE Show names of all indices on TABLE(“.indices”命令作用类似的方 式是列出特定表的所有的索引,需要带上表名参数)
.mode MODE Set mode to one of “line(s)”, “column(s)”, “insert”, “list”, or “html”(八种不同的格式显示一个查询的结果:”csv”, “列”, “html”, “插入”, “行”, “制表”和”tcl”。你可以用”.mode”点命令在这些输出格式之间切换。)
.mode insert TABLE Generate SQL insert statements for TABLE
.nullvalue STRING Print STRING instead of nothing for NULL data
.output FILENAME Send output to FILENAME(只须把输出文件名做为.output命令的输出参数然后所有后续查询结果将被写到那个文件中。用“.output stdout”再一次改为标准输出)
.output stdout Send output to the screen(标准输出流)
.prompt MAIN CONTINUE Replace the standard prompts
.read FILENAME Execute SQL in FILENAME(读取sql文件批量执行)
.separator STRING Change separator string for “list” mode
.show Show the current values for various settings
.timeout MS Try opening locked tables for MS milliseconds(.timeout”命令设置sqlite3等待一个试图存储文件锁定请除直到错误返回的总时)
.width NUM NUM … Set column widths for “column” mode(用“.width”命令来调整列宽)

Continue reading

调试小技巧file_put_contents() 和var_export以及var_dump

file_put_contents() 函数把一个字符串写入文件中。
我们要将数组打印到文件中,我们可以使用
<?php
$arr = array(
‘a’ => array(1,2,3),
‘b’ => array(‘b’,’c’,’d’)
);
$log = var_export($arr, true);
file_put_contents(“/var/www/study/temp.log”,$log);
?>
这样在/var/www/study/文件夹下会有temp.log文件,内容为
array (
‘a’ =>
array (
0 => 1,
1 => 2,
2 => 3,
),
‘b’ =>
array (
0 => ‘b’,
1 => ‘c’,
2 => ‘d’,
),
)
注意一定要能让web可以写入文件夹,二期var_export必须要带上true参数,这样才能把数组转成字符串.
此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。
您可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。
EG:
var_export(array(‘a’,’b’,array(‘aa’,’bb’,’cc’))) 这种与VAR_DUMP没什么区别;

$var =var_export(array(‘a’,’b’,array(‘aa’,’bb’,’cc’)),TRUE),加上TRUE后,不会再打印出来,而是给了一个变量,这样就可以直接输出;
echo $var;此时输出来的形式与var_dump()打印的相似。

php://input解决APP发送图片问题

今天公司要求用APP发送一个图片到PHP程序接收并保存起来,而且中间还需要很多参数!
以前没有做过APP和PHP交互,这次算是一个挑战吧(对一个没有人指导实习生来说)

1.APP发1.jpg,而且带有两个参数一个是假设是X和另外一个假设是Y
2.PHP负责接受X,Y和1.jpg,并且还要保存1.jpg到服务器
步骤:
1.PHP页面代码
$data = file_get_contents(‘php://input’);//这样可以获取到未经处理的原数据(保持发送的图片流不被破坏),在APP上使用X#Y#图片流使用http发送到PHP页面
//然后PHP页面进行数据处理和分割
2.数据处理
先分割数据流
$vars = explode(“#”,$data,3);//这样防止对图片流造成破坏只分割成三份即可
/*省去若干代码*/
$img = $vars[2];
$path = ‘/var/www/uploads/’;
$newfilename = time().”.jpg”;
$file = $path.$newfilename;
$handle = fopen($file, “w”);

if ($handle) {fwrite($handle,$img);
fclose($handle);
}
^_^,看看/var/www/目录下是不是生成了一个图片?

filter_input()详解,$_GET,$_POST,$_ENV,$_SERVER,$_SESSION,$_REQUEST

filter_input() 函数从脚本外部获取输入,并进行过滤。

本函数用于对来自非安全来源的变量进行验证,比如用户的输入。

本函数可从各种来源获取输入:

  • INPUT_GET
  • INPUT_POST
  • INPUT_COOKIE
  • INPUT_ENV
  • INPUT_SERVER
  • INPUT_SESSION (Not yet implemented)
  • INPUT_REQUEST (Not yet implemented)

如果成功,则返回被过滤的数据,如果失败,则返回 false,如果 variable 参数未设置,则返回 NULL。

例如我们常常使用$_POST[‘id’]获取input中name=id的value

也可使用

filter_input(‘INPUT_POST‘,id),get和cookie都不多说了。说下ENV吧?有的会说ENV是神吗?

$_ENV(很少人用到的一个环境变量,因为环境不同而不同)

你可使用print_r($_ENV)查看具体内容,但是~~~有可能是空的哦,那是因为你的php.ini配置中

variables_order = “GPCS”

而GPCS是代表GET/POST/COOKIE/SERVER

你修改成variables_order = “EGPCS”就可查看环境变量了

贴出来我的电脑上环境使用print_r($_ENV)结果是

[APACHE_RUN_DIR] => /var/run/apache2
[APACHE_PID_FILE] => /var/run/apache2.pid
[PATH] => /usr/local/bin:/usr/bin:/bin
[APACHE_LOCK_DIR] => /var/lock/apache2
[LANG] => C
[APACHE_RUN_GROUP] => www-data
[APACHE_RUN_USER] => www-data
[APACHE_LOG_DIR] => /var/log/apache2
[PWD] => /root

然后再继续回到$_SERVER上(虽然有的还看不懂,但是贴出来以后慢慢分析)

[HTTP_HOST] => zendstudy
[HTTP_CONNECTION] => keep-alive
[HTTP_CACHE_CONTROL] => max-age=0
[HTTP_USER_AGENT] => Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch
[HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8
[HTTP_ACCEPT_CHARSET] => GBK,utf-8;q=0.7,*;q=0.3
[PATH] => /usr/local/bin:/usr/bin:/bin
[SERVER_SIGNATURE] => <address>Apache Server at zendstudy Port 80</address>

[SERVER_SOFTWARE] => Apache
[SERVER_NAME] => zendstudy
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => /var/www/zendstudy/public
[SERVER_ADMIN] => [no address given]
[SCRIPT_FILENAME] => /var/www/zendstudy/public/index.php
[REMOTE_PORT] => 33639
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /
[SCRIPT_NAME] => /index.php
[PHP_SELF] => /index.php
[REQUEST_TIME] => 1358257020

$_REQUEST(使用GET或者POST的都可以使用这个获取到,为何不用呢?这个速度比较慢,所有一般不用的~)

file_get_contents()

今天遇到一个非常棘手的问题,然后我就突然发现这个函数竟然可以这样用~~

$data = file_get_contents(“/var/www/1.jpg”)

然后~~

$newname = “/var/www/2.jpg”;

$handle = fopen($newname, “w”);

fwrite($handle,$img);

fclose($handle);

然后的然后就发现~~~2图片可以正常使用

Zend_Db_Adapter使用详情

Zend_Db_Adapter是zendfrmaeword的数据库抽象层api. 基于pdo, 你可以使用 Zend_Db_Adapter 连接和处理多种 数据库,包括:microsoft SQL Server,MySql,SQLite等等.
1.连接数据库

<?php
require_once ‘Zend/Db.php’;
$params = array (‘host’ => ‘127.0.0.1’,
‘username’ => ‘root’,
‘password’ => ‘root’,
‘dbname’ => ‘zendstudy’,
charset’ => ‘utf8’)
$db = Zend_Db::factory(‘PDO_MYSQL’, $params);
?>

2.SQL语句添加引号防止攻击

第一种是quote() 方法. 该方法会根据数据库adapter为标量加上 合适的引号;假如你试图对一个数组做quote操作, 它将为数组中 每个元素加上引号,并用”,”分隔返回.
$value = $db->quote(‘St John”s Wort’);
//$value 现在变成了 ‘St John\”s Wort’
$value = $db->quote(array(‘a’, ‘b’, ‘c’));
//$value现在变成了 ‘a’, ‘b’, ‘c'(“,”分隔的字符串)
第二种是 quoteInto() 方法. 你提供一个包含问号占位符的基础字符串 , 然后在该位置加入带引号的标量或者数组. 该 方法对于随需构建查询sql语句和条件语句是很有帮助的. 使用 quoteInto处理过的标量和数组返回结果与quote() 方法相同.
$where = $db->quoteInto(‘id = ?’, 1);//id = 1
$where = $db->quoteInto(‘id IN(?)’, array(1, 2, 3));//id IN(1, 2, 3)

Continue reading

Zend FrameWork之Zend_Db_Table笔记

根据Zend_Db_Table操作数据(也就是在models建立一个对应表的模型)
准备条件:
course数据表中有cid课程号,自增,主键,cname课程名称,ccredit课程学分
在models建立Course.php编写Course类继承Zend_Db_Table
写表$_name=’course’;表主键$_primary=’cid’;
1.插入记录操作
要在表中插入一行新数据,只需要将列名:数据的关联数组作为参数,调 用insert()方法即可.(zend framework)会自动对数据进行加引号处理, 并返回插入的最后一行的id值(注意:这里不同于 zend_db_adapter::insert方法,后者返回的是插入的行数).
例子:
$cModel = new Course();
$data = array(‘cname’ => ‘网络编程’, ‘ccredit’ => ‘2’);
//cname和ccredit必须和数据表字段对应
$cModel->insert($data);//这样数据库中就会增加一条信息

2.更新数据操作
要修改表中的任意行数据,我们可以设定一个列名:数据的关联数组作为参数,调 用update()方法,同是通过一个where条件从句来决定需要改变的行.该方法将会 修改表中数据并返回被修改的行数.
条件从句不会增加引号,所以建议使Adapter编写
例子:
$cModel = new Course();
$where = $cModel->getAdapter()->quoteInto(“`cid` = ?”, 2);
$data = array(‘cname’ => ‘C语言’, ‘ccredit’ => ‘3’);
$cModel->update($data, $where);

Continue reading