php>=5.5版本,使用PHP CURL POST文件上传

参考:http://blog.csdn.net/ljfrocky/article/details/46009251

php55CurlPost.php

<?php
 
define('FORM_BOUNDARY', uniqid('----WebKitFormBoundary'));
define('FORM_HYPHENS', '--');
define('FORM_EOL', "\r\n");
define('FORM_IMG_FIELD_NAME', 'img[]');
 
/*
 * 要POST的文本数据和本地图片
 */
$text_data = [
    'username' => 'Tom',
    'password' => '123456',
];
$img_data = [
    '111.jpg' => '/Applications/XAMPP/xamppfiles/htdocs/indomeme.yyy/111.jpg',
    '222.jpg' => '/Applications/XAMPP/xamppfiles/htdocs/indomeme.yyy/222.jpg',
];
 
$url = 'http://indomeme.yyy/php55Upload.php'; // 服务器URL,根据实际情况进行修改
$req_headers = [
    'Content-Type: multipart/form-data; boundary=' . FORM_BOUNDARY,
];
$post_data = '';
 
array_walk($text_data, 'text_form_data_splice');
array_walk($img_data, 'image_form_data_splice');
if (!empty($post_data)) {
    $post_data .= FORM_HYPHENS . FORM_BOUNDARY . FORM_HYPHENS;
}
 
$result = curl_post($url, $req_headers, $post_data);
 
var_dump($result);
 
/**
 * 拼接文本类型的表单项
 * @param string $value 表单项的域值
 * @param string $key 表单项的域名
 */
function text_form_data_splice($value, $key) {
    global $post_data;
    $post_data .= FORM_HYPHENS . FORM_BOUNDARY . FORM_EOL
               . "Content-Disposition: form-data; name=\"$key\""
               . FORM_EOL . FORM_EOL
               . $value . FORM_EOL;
}
 
/**
 * 拼接上传图片类型的表单项
 * @param string $value 图片在本地的路径
 * @param string $key 图片名称
 */
function image_form_data_splice($value, $key) {
    global $post_data;
 
    $image_type = exif_imagetype($value);
    if ($image_type === false) {
        return;
    }
    $mime_type = image_type_to_mime_type($image_type);
    $post_data .= FORM_HYPHENS . FORM_BOUNDARY . FORM_EOL
               . "Content-Disposition: form-data; name=\"" . FORM_IMG_FIELD_NAME
               . "\"; filename=\"$key\"" . FORM_EOL
               . "Content-Type: $mime_type" . FORM_EOL . FORM_EOL
               . file_get_contents($value) . FORM_EOL;
}
 
function curl_post($url, array $header, $data) {
    $options = [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HEADER => false,
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => $header,
        CURLOPT_POSTFIELDS => $data,
    ];
 
    $ch = curl_init();
    curl_setopt_array($ch, $options);
    $resp = curl_exec($ch);
    if (curl_errno($ch)) {
        $ret = [
            'code' => -1,
            'resp' => curl_error($ch),
        ];
    } else {
        $ret = [
            'code' => curl_getinfo($ch, CURLINFO_HTTP_CODE),
            'resp' => $resp,
        ];
    }
    curl_close($ch);
 
    return $ret;
}

php55Upload.php

<?php
var_dump($_FILES);
var_dump($_POST);

thinkphp u函数解析出现.php路径

原文:http://www.linuxde.net/2014/12/15635.html

thinkphp在Nginx没有pathinfo的情况出现.PHP的文件,这个让人很是纠结。在服务器是Linux,web服务器是nginx, CGI接口是FASTCGI,就会出现这个问题。

问题原因:ThinkPHP/common/runtime.php中定义IS_CGI常量的定义有问题;错误代码:

thinkphp在nginx没有pathinfo的情况出现.php的URL的解决方法
在fpm下,PHP_SAPI的值是fpm-fcgi,所以判断IS_CGI为0。导致在定义_PHP_FILE_常量时错误,进而导致 ThinkPHP/Lib/Core/Dispatcher.class.php中定义__APP__常量值错误。而ThinkPHP/Common /functions.php中U()方法定义用到__APP__,导致U()创建的URL错误;U()部分代码:

thinkphp在nginx没有pathinfo的情况出现.php的URL的解决方法
简单来说,当cgi.fix_pathinfo=0时,_PHP_FILE_获取的值是.php,导致U函数生成URL不正确,改为1后,_PHP_FILE_获取的值是index.php。

但是cgi.fix_pathinfo=1时会有安全隐患,目前暂时先把代码改成如下了:

if (IS_CGI) {
//CGI/FASTCGI模式下
//$_temp = explode(‘.php’,$_SERVER[‘PHP_SELF’]);
//define(‘_PHP_FILE_’, rtrim(str_replace($_SERVER[‘HTTP_HOST’],”,
//$_temp[0].’.php’),’/’));
define(‘_PHP_FILE_’, rtrim($_SERVER[‘SCRIPT_NAME’], ‘/’));
} else {
define(‘_PHP_FILE_’, rtrim($_SERVER[‘SCRIPT_NAME’], ‘/’));
}

thinkphp5中遇到的一些问题

thinkphp5中遇到的一些问题:

在控制器中查询一个表的数据,例如查询user表的用户列表
\think\Db::name(‘user’)->where(‘status’,1)->select();
上面这句是可以执行的,因为加了\think\命名空间,而官方文档中写的是下面,可能导致看文档的人误解
Db::name(‘user’)->where(‘status’,1)->select();

也可以在控制器中直接用助手函数,这种方式最为方便简单。
db(‘user’)->where(‘status’,1)->select();

另外,如果你在model/user.php这个模型是存在的,那么也可以在控制器中用如下方法
$user = new User();
$user->where(‘status’,1)->select();

————————————————-
另外,如果数据库配置文件里面
// 数据集返回类型
‘resultset_type’ => ‘collection’,
那么,上面的那些返回就是一个集合对象,而不是一个数组,但是可以和数组无差别使用
具体collection包含的方法,请参考
https://www.kancloud.cn/manual/thinkphp5/150164

附:
thinkphp5.x之Collection(集合)解析 php集合
http://blog.csdn.net/fenglailea/article/details/52723586

wordpress里面的慢SQL,把wp_postmeta.meta_key的类型由varchar(255)改变为varchar(191)

SELECT DISTINCT meta_key
			FROM wp_postmeta
			WHERE meta_key NOT BETWEEN '_' AND '_z'
			HAVING meta_key NOT LIKE '\\_%'
			ORDER BY meta_key
			LIMIT 30;

当wordpress里面的慢SQL,把wp_postmeta.meta_key的类型由varchar(255)改变为varchar(191)
目前我的mysql版本是5.5
不知道新版本有没有改进,看了别人描述(https://core.trac.wordpress.org/ticket/33885#comment:5),说是只取前191个字节做索引。

discuz的php防止sql注入函数

转载自:http://www.jb51.net/article/26069.htm
最早开始学习php的时候根本没考虑过安全方面的问题,那时候就是想能做出功能就是万岁了。随着做项目的时间慢慢加长,越来越感觉到网站安全方面的问题十分重要。
最近在做一个主题投票网站,客户懂一些程序方面的东西。有特别要求需要过滤一些字符防止sql注入。本来这方面就没有特别的研究过。呵呵,又发扬了一回拿来主义。把discuz论坛的sql防注入函数取了来!

$magic_quotes_gpc = get_magic_quotes_gpc(); 
@extract(daddslashes($_COOKIE)); 
@extract(daddslashes($_POST)); 
@extract(daddslashes($_GET)); 
if(!$magic_quotes_gpc) { 
$_FILES = daddslashes($_FILES); 
} 
 
 
function daddslashes($string, $force = 0) { 
if(!$GLOBALS['magic_quotes_gpc'] || $force) { 
if(is_array($string)) { 
foreach($string as $key => $val) { 
$string[$key] = daddslashes($val, $force); 
} 
} else { 
$string = addslashes($string); 
} 
} 
return $string; 
}

大家可以增强下面的代码加以保护服务器的安全,PHP防止SQL注入安全函数十分重要!

/* 
函数名称:inject_check() 
函数作用:检测提交的值是不是含有SQL注射的字符,防止注射,保护服务器安全 
参  数:$sql_str: 提交的变量 
返 回 值:返回检测结果,ture or false 
*/ 
function inject_check($sql_str) { 
return eregi('select|insert|and|or|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str); // 进行过滤 
} 
 
/* 
函数名称:verify_id() 
函数作用:校验提交的ID类值是否合法 
参  数:$id: 提交的ID值 
返 回 值:返回处理后的ID 
*/ 
function verify_id($id=null) { 
if (!$id) { exit('没有提交参数!'); } // 是否为空判断 
elseif (inject_check($id)) { exit('提交的参数非法!'); } // 注射判断 
elseif (!is_numeric($id)) { exit('提交的参数非法!'); } // 数字判断 
$id = intval($id); // 整型化 
 
return $id; 
} 
 
/* 
函数名称:str_check() 
函数作用:对提交的字符串进行过滤 
参  数:$var: 要处理的字符串 
返 回 值:返回过滤后的字符串 
*/ 
function str_check( $str ) { 
if (!get_magic_quotes_gpc()) { // 判断magic_quotes_gpc是否打开 
$str = addslashes($str); // 进行过滤 
} 
$str = str_replace("_", "\_", $str); // 把 '_'过滤掉 
$str = str_replace("%", "\%", $str); // 把 '%'过滤掉 
 
return $str; 
} 
 
/* 
函数名称:post_check() 
函数作用:对提交的编辑内容进行处理 
参  数:$post: 要提交的内容 
返 回 值:$post: 返回过滤后的内容 
*/ 
function post_check($post) { 
if (!get_magic_quotes_gpc()) { // 判断magic_quotes_gpc是否为打开 
$post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 
} 
$post = str_replace("_", "\_", $post); // 把 '_'过滤掉 
$post = str_replace("%", "\%", $post); // 把 '%'过滤掉 
$post = nl2br($post); // 回车转换 
$post = htmlspecialchars($post); // html标记转换 
 
return $post; 
}