手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:php

郁闷:php console与web的问题

最近在做个小东西,想用PHP跑console,生成一个文件,然后由WEB去调用这个文件。可是却一直失败。

命令行下,用crontab跑,因为WEB是在Safemode下面,但我需要Exec,因此crontab调用php的时候,我就指定了phpini,类似/php -c phpinifilepath phpfilename,于是这样可以了。

但生成出来的文件被WEB调用后。一直显示是失败。郁闷了。。

纯记录,无意义

Tags: php, cli, web

js的几个简单互换(ord and chr)

在PHP中可以直接对字符串进行比较,比如

PHP代码
  1. $a = 'A';  
  2. $b = 'B';  
  3. var_dump( $a > $b);  

当然,在JS中也可以

JavaScript代码
  1. var s = 'A';  
  2. var t = 'B';  
  3. alert( s < t);  

为什么可以比大小呢?那是因为,他们是直接转成ascii值来进行比较的,PHP中是 ord($a) 转成了65,B就是66了,所以$a>$b是返回false

PHP有两个函数用来互换,一个是ord,一个是chr,那么js中怎么办呢?也有,一个是charCodeAt(),一个是fromCharCode();看例子吧。。。

PHP代码
  1. <?php  
  2. $a = 'A';  
  3. echo ord($a);  
  4. echo chr( ord($a) );  
JavaScript代码
  1. var s= 'A';  
  2. alert( s.charCodeAt() );  
  3. //var t = s.charCodeAt();  
  4. alert( String.fromCharCode( s.charCodeAt() ) );  
js中对于fromCharCode和php不太一样了。

Tags: ord, chr, php

drupal的db_query安全过滤

这篇 文章已经是07年的了,不过,我一直没有关注过drupal的db类,所以对于这方面我也根本 就没有在意过。8过,我在我的siterpc中,我也是采用了sprintf的写法,不是为了安全,而是为了格式化。因为在siterpc里我们几乎不接受外部变量,所有的变量都是由我们自己传入,所以对于安全方便忽略了很多。但还是用sprintf来格式化SQL语句了。

因此看到这篇drupal的db_query安全过滤,突然发现,可以让我的代码少写很多了。(参数可变时请使用vsprintf)

以下是原文 :

Drupal通过C风格的字符串输出格式实现了对sql语句的安全过滤。
使用方法:

PHP代码
  1. db_query("SELECT n.nid FROM {node} n WHERE n.type = '%s'"$type);//正确做法  
  2. //这不等于以下语句,使用sprintf并不能避免mysql注入。  
  3. db_query(sprintf("SELECT n.nid FROM {node} n WHERE n.type = '%s'"$type)); //不正确  
drupal db_query核心代码如下:
PHP代码
  1. /** 
  2.  * Indicates the place holders that should be replaced in _db_query_callback(). 
  3.  */  
  4. define('DB_QUERY_REGEXP''/(%d|%s|%%|%f|%b)/');  
  5.   
  6. /** 
  7.  * Runs a basic query in the active database. 
  8.  * 
  9.  * User-supplied arguments to the query should be passed in as separate 
  10.  * parameters so that they can be properly escaped to avoid SQL injection 
  11.  * attacks. 
  12.  * 
  13.  * @param $query 
  14.  *   A string containing an SQL query. 
  15.  * @param ... 
  16.  *   A variable number of arguments which are substituted into the query 
  17.  *   using printf() syntax. Instead of a variable number of query arguments, 
  18.  *   you may also pass a single array containing the query arguments. 
  19.  
  20.  *   Valid %-modifiers are: %s, %d, %f, %b (binary data, do not enclose 
  21.  *   in '') and %%. 
  22.  * 
  23.  *   NOTE: using this syntax will cast NULL and FALSE values to decimal 0, 
  24.  *   and TRUE values to decimal 1. 
  25.  * 
  26.  * @return 
  27.  *   A database query result resource, or FALSE if the query was not 
  28.  *   executed correctly. 
  29.  */  
  30. function db_query($query) {  
  31.   $args = func_get_args();  
  32.   array_shift($args);  
  33.   $query = db_prefix_tables($query);  
  34.   if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax  
  35.     $args = $args[0];  
  36.   }  
  37.   _db_query_callback($args, TRUE);  
  38.   $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback'$query);  
  39.   return _db_query($query);  
  40. }  
  41.   
  42. /** 
  43.  * Helper function for db_query(). 
  44.  */  
  45. function _db_query_callback($match$init = FALSE) {  
  46.   static $args = NULL;  
  47.   if ($init) {  
  48.     $args = $match;  
  49.     return;  
  50.   }  
  51.   
  52.   switch ($match[1]) {  
  53.     case '%d'// We must use type casting to int to convert FALSE/NULL/(TRUE?)  
  54.       return (int) array_shift($args); // We don't need db_escape_string as numbers are db-safe  
  55.     case '%s': 
  56.       return db_escape_string(array_shift($args)); 
  57.     case '%%':  
  58.       return '%'; 
  59.     case '%f': 
  60.       return (float) array_shift($args); 
  61.     case '%b': // binary data  
  62.       return db_encode_blob(array_shift($args));  
  63.   }  
  64. }  
简单的对一些输入做了处理。参考: http://drupal.org/node/101496

原文来自于:http://www.luochunhui.com/id/315

Tags: drupal, php, escape_string

学着写PHP飞信

飞信,对于我们搞开发的人来说,确实还是需要的。网上也有一些php飞信的类(看的也很累),不过,我看的是zendstudio.net,因为看起来好象方便。
自从上次飞信改过IP地址后,我才真正的仔细看过这方面的东西(其实也只是稍看看啦。。。哈哈)

其实,说真的,飞信这东西,PHP版的在我眼里感觉很深奥,因为要抓包,以前还从来没有这样抓过,总觉得是一件很复杂很难的事情。但自从不能给好友发短信后,我到Zendstudio.net上看过别人回复后,才发现他根本就没有提供。所以就萌发了要自己的写的念头。

于是找了smartsniff这个抓包工具,找来libfetion,关掉我所有的上网的程序。然后运行他开始抓包。
发现真的很方便。。。
于是就准备开始写了。不用fsockopen,而准备直接采用curl。。。目前刚刚写了一个getSIPC,发现速度好象是比fsockopen的速度快很多。【可能是因为,zendstudio.net他是按字节读取,然后用正则处理获得sipcproxy,而我是直接取回来用simplexml_loadstring,然后直接输出这个对象的值 ?也或许只是一个感觉而己,其实并没有变化?晚上回去输出执行时间看一下就知道了。HOHO】

慢慢写,因为注意过给好友发短信的功能,是利用SID的,但普通情况下,获取不到SID,必须得先把好友拉回来做一个缓存。这样就可以了。所以本版飞信应该不会公开,否则,谁也不敢使用。【随便说说,还没写完呢。。。。】

Tags: 飞信, fetion, php

几行代码实现文件打包下载

短短几行代码实现文件打包下载。。。

PHP代码
  1. /** 
  2.  * 没有写成class 或者 function ,需要的朋友自己写,就这么几行。。 
  3.  */  
  4. $filename = "./test/test.zip"//最终生成的文件名(含路径)  
  5. if(!file_exists($filename)){  
  6.     //重新生成文件  
  7.     $zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释  
  8.     if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {  
  9.         exit('无法打开文件,或者文件创建失败');  
  10.     }  
  11.     foreach$datalist as $val){  
  12.         $attachfile = $attachmentDir . $val['filepath'];    //获取原始文件路径  
  13.         if(file_exists($attachfile)){  
  14.             $zip->addFile( $attachfile , basename($attachfile));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下  
  15.         }  
  16.     }  
  17.     $zip->close();//关闭  
  18. }  
  19. if( !file_exists($filename)){  
  20.     exit("无法找到文件"); //即使创建,仍有可能失败。。。。  
  21. }  
  22. header("Cache-Control: public");   
  23. header("Content-Description: File Transfer");   
  24. header('Content-disposition: attachment; filename='.basename($filename)); //文件名  
  25. header("Content-Type: application/zip"); //zip格式的  
  26. header("Content-Transfer-Encoding: binary");    //告诉浏览器,这是二进制文件   
  27. header('Content-Length: 'filesize($filename));    //告诉浏览器,文件大小  
  28. @readfile($filename);         

Tags: php, 文件下载, zip压缩