存档在 2016年4月

PHP日志记录方法

2016年4月30日

一种变通的方案是将日志出处到一个文件里。PHP里提供了一个error_log(),能帮助你快捷的将日志输出到指定的文件里。
这个函数的接口描述如下:

bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )

其中第一个参数是要输出的日志,第二个参数是输出的方式,一共有四种方式,分别是:

error_log() 日志类型
0 message 发送到 PHP 的系统日志,使用
操作系统的日志机制或者一个文件,取决于
error_log 指令设置了什么。
这是个默认的选项。
1 message 发送到参数 destination
设置的邮件地址。
第四个参数 extra_headers 只有在这个类型里才会被用到。
2 不再是一个选项。
3 message 被发送到位置为 destination 的文件里。
字符 message 不会默认被当做新的一行。
4 message 直接发送到 SAPI 的日志处理程序中。

我们最常用的是输出到日志文件里,就是3.
下面是一个用法的例子:

<?php
// 如果无法连接到数据库,发送通知到服务器日志
if (!Ora_Logon($username, $password)) {
    error_log("Oracle database not available!", 0);
}

// 如果用尽了 FOO,通过邮件通知管理员
if (!($foo = allocate_new_foo())) {
    error_log("Big trouble, we're all out of FOOs!", 1,
               "operator@example.com");
}

// 调用 error_log() 的另一种方式:
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
?>

MAMP Pro 3.2 安装文件|序列号|注册码

2016年4月28日

1.下载链接MAMP Pro 3.2 安装文件
2.序列号
SN: DED4-0A88-3A11-F9FDE
SN: CB7E-F665-A199-E2E68

Ubuntu 下 Wifi无驱动问题

2016年4月28日

安装Ubuntu后发现右上角的network-manager菜单中并不能选择和搜索wifi无线网
解决方法:
参考:https://help.ubuntu.com/community/WifiDocs/Driver/bcm43xx#Switching_between_drivers
安装bcmwl驱动,终端中输入

    sudo apt-get update(非必须)
    sudo apt-get install bcmwl-kernel-source  

启用驱动

sudo modprobe -r b43 ssb wl  
sudo modprobe wl 

smarty foreach详解

2016年4月24日

{foreach} is used to loop over an associative array as well a numerically-indexed array, unlike {section} which is for looping over numerically-indexed arrays only. The syntax for {foreach} is much easier than {section}, but as a tradeoff it can only be used for a single array. Every{foreach} tag must be paired with a closing {/foreach} tag.

{foreach} 用于像循环访问一个数字索引数组一样循环访问一个关联数组,与仅能访问数字索引数组的{section}不同,{foreach}的语法比 {section}的语法简单得多,但是作为一个折衷方案也仅能用于单个数组。每个{foreach}标记必须与关闭标记{/foreach}成对出现。

Attribute Name属性名称 Type类型 Required必要 Default默认值 Description描述
from array数组 Yes必要 n/a The array you are looping through
循环访问的数组
item string字符串 Yes必要 n/a The name of the variable that is the current element
当前元素的变量名
key string字符串 No可选 n/a The name of the variable that is the current key
当前键名的变量名
name string字符 No可选 n/a The name of the foreach loop for accessing foreach properties
用于访问foreach属性的foreach循环的名称
  • Required attributes are from and item.
  • from和item是必要属性
  • The name of the {foreach} loop can be anything you like, made up of letters, numbers and underscores, like PHP variables.
  • {foreach}循环的name可以是任何字母,数组,下划线的组合,参考PHP变量。
  • {foreach} loops can be nested, and the nested {foreach} names must be unique from each other.
  • {foreach}循环可以嵌套,嵌套的{foreach}的名称应当互不相同。
  • The from attribute, usually an array of values, determines the number of times {foreach} will loop.
  • from属性通常是值数组,被用于判断{foreach}的循环次数。
  • {foreachelse} is executed when there are no values in the from variable.
  • 在from变量中没有值时,将执行{foreachelse}。
  • {foreach} loops also have their own variables that handle properties. These are accessed with: {$smarty.foreach.name.property} with “name” being the name attribute.
  • {foreach}循环也有自身属性的变量,可以通过{$smarty.foreach.name.property}访问,其中”name”是name属性。

    Note: The name attribute is only required when you want to access a {foreach} property, unlike {section}. Accessing a {foreach} property with name undefined does not throw an error, but leads to unpredictable results instead.

  •   注意:name属性仅在需要访问{foreach}属性时有效,与{section}不同。访问未定义name的{foreach}属性不会抛出一个错误,但将导致不可预知的结果。

  • {foreach} properties are indexiterationfirstlastshowtotal.
  • {foreach}属性有index, iteration, first, last, show, total.

Example 7-5. The item attribute
例 7-5. item属性

<?php
$arr = array(1000, 1001, 1002);
$smarty->assign('myArray', $arr);
?>

Template to output $myArray in an un-ordered list
用模板以无序列表输出$myArray

<ul>
{foreach from=$myArray item=foo}
    <li>{$foo}</li>
{/foreach}
</ul>

The above example will output:
上例将输出:

<ul>
    <li>1000</li>
    <li>1001</li>
    <li>1002</li>
</ul>

Example 7-6. Demonstrates the item and key attributes
例 7-6. 演示item和key属性

<?php
$arr = array(9 => 'Tennis', 3 => 'Swimming', 8 => 'Coding');
$smarty->assign('myArray', $arr);
?>

Template to output $myArray as key/val pair, like PHP’s foreach.
用模板按键名/键值对的形式输出$myArray, 类似于PHP的foreach。

<ul>
{foreach from=$myArray key=k item=v}
   <li>{$k}: {$v}</li>
{/foreach}
</ul>

The above example will output:
上例将输出:

<ul>
    <li>9: Tennis</li>
    <li>3: Swimming</li>
    <li>8: Coding</li>
</ul>

Example 7-7. {foreach} with associative item attribute
例 7-7. {foreach}的item属性是关联数组

<?php
$items_list = array(23 => array('no' => 2456, 'label' => 'Salad'),
                    96 => array('no' => 4889, 'label' => 'Cream')
                    );
$smarty->assign('items', $items_list);
?>

Template to output $items with $myId in the url
模板中,url通过$myId输出$items

<ul>
{foreach from=$items key=myId item=i}
  <li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li>
{/foreach}
</ul>

The above example will output:
上例将输出:

<ul>
  <li><a href="item.php?id=23">2456: Salad</li>
  <li><a href="item.php?id=96">4889: Cream</li>
</ul>

Example 7-8. {foreach} with nested item and key
例 7-8. {foreach}使用嵌套的item和key
Assign an array to Smarty, the key contains the key for each looped value.
向Smarty设置一个数组,对于每个键名对应的每个循环值都包括键。

<?php
 $smarty->assign('contacts', array(
                             array('phone' => '1',
                                   'fax' => '2',
                                   'cell' => '3'),
                             array('phone' => '555-4444',
                                   'fax' => '555-3333',
                                   'cell' => '760-1234')
                             ));
?>

The template to output $contact.
用于输出$contact的模板。

{foreach name=outer item=contact from=$contacts}
  <hr />
  {foreach key=key item=item from=$contact}
    {$key}: {$item}<br />
  {/foreach}
{/foreach}

The above example will output:
上例将输出:

<hr />
  phone: 1<br />
  fax: 2<br />
  cell: 3<br />
<hr />
  phone: 555-4444<br />
  fax: 555-3333<br />
  cell: 760-1234<br />

Example 7-9. Database example with {foreachelse}
例 7-9. 使用{foreachelse}的数据库示例
A database (eg PEAR or ADODB) example of a search script, the query results assigned to Smarty
一个数据库(例如PEAR或ADODB)的搜索脚本示例,

<?php
  $search_condition = "where name like '$foo%' ";
  $sql = 'select contact_id, name, nick from contacts '.$search_condition.' order by name';
  $smarty->assign('results', $db->getAssoc($sql) );
?>

The template which display “None found” if no results with {foreachelse}.
借助{foreachelse}标记在没有结果时模板输出”None found”字样。

{foreach key=cid item=con from=$results}
    <a href="contact.php?contact_id={$cid}">{$con.name} - {$con.nick}</a><br />
{foreachelse}
    No items were found in the search
{/foreach}

.index
index contains the current array index, starting with zero.
.index包含当前数组索引,从零开始。

Example 7-10. index example
例 7-10. index示例

{* The header block is output every five rows *}
{* 每五行输出一次头部区块 *}
<table>
{foreach from=$items key=myId item=i name=foo}
  {if $smarty.foreach.foo.index % 5 == 0}
     <tr><th>Title</th></tr>
  {/if}
  <tr><td>{$i.label}</td></tr>
{/foreach}
</table>

.iteration
iteration contains the current loop iteration and always starts at one, unlike index. It is incremented by one on each iteration.
iteration包含当前循环次数,与index不同,从1开始,每次循环增长1。

Example 7-11. iteration and index example
例 7-11. iteration和index示例

{* this will output 0|1, 1|2, 2|3, ... etc *}
{* 该例将输出0|1, 1|2, 2|3, ... 等等 *}
{foreach from=$myArray item=i name=foo}
{$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
{/foreach}

.first
first is TRUE if the current {foreach} iteration is the initial one.
first在当前{foreach}循环处于初始位置时值为TRUE。

Example 7-12. first property example
例 7-12. first属性示例

{* show LATEST on the first item, otherwise the id *}
{* 对于第一个条目显示LATEST而不是id *}
<table>
{foreach from=$items key=myId item=i name=foo}
<tr>
  <td>{if $smarty.foreach.foo.first}LATEST{else}{$myId}{/if}</td>
  <td>{$i.label}</td>
</tr>
{/foreach}
</table>

.last
last is set to TRUE if the current {foreach} iteration is the final one.
last在当前{foreach}循环处于最终位置是值为TRUE。

Example 7-13. last property example
例 7-13. last属性示例

{* Add horizontal rule at end of list *}
{* 在列表结束时增加一个水平标记 *})
{foreach from=$items key=part_id item=prod name=products}
  <a href="#{$part_id}">{$prod}</a>{if $smarty.foreach.products.last}<hr>{else},{/if}
{foreachelse}
  ... content ...
{/foreach}

.show
show is used as a parameter to {foreach}. show is a boolean value. If FALSE, the {foreach} will not be displayed. If there is a {foreachelse} present, that will be alternately displayed.
show是{foreach}的参数. show是一个布尔值。如果值为FALSE,{foreach}将不被显示。如果有对应的{foreachelse},将被显示。
.total
total contains the number of iterations that this {foreach} will loop. This can be used inside or after the {foreach}.
total包括{foreach}将循环的次数,既可以在{foreach}中使用,也可以在之后使用。

Example 7-14. total property example
例 7-14. total属性示例

{* show rows returned at end *}
{* 在结束位置显示行数 *}
{foreach from=$items key=part_id item=prod name=foo}
{$prod.name><hr/>
{if $smarty.foreach.foo.last}
  <div id="total">{$smarty.foreach.foo.total} items</div>
{/if}
{foreachelse}
 ... something else ...
{/foreach}

See also {section} and $smarty.foreach.
参考{section}和$smarty.foreach。

ecshop二次开发中增加input输入框,并且写入到数据库

2016年4月24日

首先打开注册页面。user.php?act=register这个是注册的url首先我们去找user.php然后找到act=register动作

if ($action == 'register')
{
    if ((!isset($back_act)||empty($back_act)) && isset($GLOBALS['_SERVER']['HTTP_REFERER']))
    {
        $back_act = strpos($GLOBALS['_SERVER']['HTTP_REFERER'], 'user.php') ? './index.php' : $GLOBALS['_SERVER']['HTTP_REFERER'];
    }

    /* 取出注册扩展字段 */
    $sql = 'SELECT * FROM ' . $ecs->table('reg_fields') . ' WHERE type < 2 AND display = 1 ORDER BY dis_order, id';
    $extend_info_list = $db->getAll($sql);
    $smarty->assign('extend_info_list', $extend_info_list);

    /* 验证码相关设置 */
    if ((intval($_CFG['captcha']) & CAPTCHA_REGISTER) && gd_version() > 0)
    {
        $smarty->assign('enabled_captcha', 1);
        $smarty->assign('rand',            mt_rand());
    }

    /* 密码提示问题 */
    $smarty->assign('passwd_questions', $_LANG['passwd_questions']);

    /* 增加是否关闭注册 */
    $smarty->assign('shop_reg_closed', $_CFG['shop_reg_closed']);
//    $smarty->assign('back_act', $back_act);
      $smarty->display('user_passport.dwt');
}

看一下display到那个模板。找到user_passport.dwt模板,在这个模板里边添加一个input框,这个就不用多说了吧。我这的input 名称叫 company

 <tr>
          <td align="right">公司名称</td>
          <td><input name="company" type="text" size="25" id="<span style="color:#ff0000;">company</span>"   class="inputBg"/></td>
        </tr>

这样就完成了第一步。然后看看他提交到那个php文件进行处理的。

   <tr>
          <td> </td>
          <td align="left">
          <input name="act" type="hidden" value="act_register" >
          <input type="hidden" name="back_act" value="{$back_act}" />
          <input name="Submit" type="submit" value="" class="us_Submit_reg">
          </td>
        </tr>

由此可以看出是通过act=act_register完成的,所以要在user.php里找到这个动作。

elseif ($action == 'act_register')
{
    /* 增加是否关闭注册 */
    if ($_CFG['shop_reg_closed'])
    {
        $smarty->assign('action',     'register');
        $smarty->assign('shop_reg_closed', $_CFG['shop_reg_closed']);
        $smarty->display('user_passport.dwt');
    }
    else
    {
        include_once(ROOT_PATH . 'includes/lib_passport.php');

        $username = isset($_POST['username']) ? trim($_POST['username']) : '';
        $password = isset($_POST['password']) ? trim($_POST['password']) : '';
        $email    = isset($_POST['email']) ? trim($_POST['email']) : '';
        $other['msn'] = isset($_POST['extend_field1']) ? $_POST['extend_field1'] : '';
        $other['qq'] = isset($_POST['extend_field2']) ? $_POST['extend_field2'] : '';
        $other['office_phone'] = isset($_POST['extend_field3']) ? $_POST['extend_field3'] : '';
        $other['home_phone'] = isset($_POST['extend_field4']) ? $_POST['extend_field4'] : '';
        $other['mobile_phone'] = isset($_POST['extend_field5']) ? $_POST['extend_field5'] : '';
	$other['company'] = isset($_POST['company']) ? $_POST['company'] : '';		
        $sel_question = empty($_POST['sel_question']) ? '' : $_POST['sel_question'];
        $passwd_answer = isset($_POST['passwd_answer']) ? trim($_POST['passwd_answer']) : '';
        $back_act = isset($_POST['back_act']) ? trim($_POST['back_act']) : '';

找到后在这里添加 $other[‘company’] = isset($_POST[‘company’]) ? $_POST[‘company’] : ”;这一项
然后在往下找。。找到下边这段代码。

if (register</span>($username, $password, $email, $other) !== false)
        {
            /*把新注册用户的扩展信息插入数据库*/
            $sql = 'SELECT id FROM ' . $ecs->table('reg_fields') . ' WHERE type = 0 AND display = 1 ORDER BY dis_order, id';   //读出所有自定义扩展字段的id
            $fields_arr = $db->getAll($sql);

            $extend_field_str = '';    //生成扩展字段的内容字符串

这个文件是在这个include文件夹里的,这里边有一个lib_passport.php打开
大概在159行
//定义other合法的变量数组
$other_key_array = array(‘msn’, ‘qq’, ‘office_phone’, ‘home_phone’, ‘mobile_phone’,’company’);
加上company,当然还得再数据库中增加一个字段叫company,然后进入后台清楚缓存,前台刷新,注册。就可以写到数据库了。

详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

2016年4月24日

实例:

1,http://localhost/aaa/ (打开aaa中的index.php)
结果:
$_SERVER[‘QUERY_STRING’] = “”;
$_SERVER[‘REQUEST_URI’] = “/aaa/”;
$_SERVER[‘SCRIPT_NAME’] = “/aaa/index.php”;
$_SERVER[‘PHP_SELF’] = “/aaa/index.php”;

2,http://localhost/aaa/?p=222 (附带查询)
结果:
$_SERVER[‘QUERY_STRING’] = “p=222”;
$_SERVER[‘REQUEST_URI’] = “/aaa/?p=222”;
$_SERVER[‘SCRIPT_NAME’] = “/aaa/index.php”;
$_SERVER[‘PHP_SELF’] = “/aaa/index.php”;

3,http://localhost/aaa/index.php?p=222&q=333
结果:
$_SERVER[‘QUERY_STRING’] = “p=222&q=333”;
$_SERVER[‘REQUEST_URI’] = “/aaa/index.php?p=222&q=333”;
$_SERVER[‘SCRIPT_NAME’] = “/aaa/index.php”;
$_SERVER[‘PHP_SELF’] = “/aaa/index.php”;

由实例可知:
$_SERVER[“QUERY_STRING”] 获取查询 语句,实例中可知,获取的是?后面的值
$_SERVER[“REQUEST_URI”] 获取 http://localhost 后面的值,包括/
$_SERVER[“SCRIPT_NAME”] 获取当前脚本的路径,如:index.php
$_SERVER[“PHP_SELF”] 当前正在执行脚本的文件名

ECSHOP会员头像,上传头像评论显示头像

2016年4月24日

ECSHOP实现会员头像功能,评论显示会员头像功能。ECSHOP几年没更新了,功能上实在不尽人意,几乎绝大部分的商城网站都有了会员头像功能,但是ECSHOP却没有。得益于ECSHOP的开源,自然有大神二次开发实现了这个功能,一流资源网免费分享出来。

参考链接:http://www.16css.com/ecshop/1142.html
相关文件:02f993d50c98fa976bb577a8d2b889b0

apache2 的httpd.conf所在位置

2016年4月24日

配置文件是 /etc/apache2/apache2.conf,Apache在启动时会自动读取这个文件的配置信息。而其他的一些配置文件,如 httpd.conf等,则是通过Include指令包含进来。在apache2.conf中可以找到这些Include行:
引用

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
# Include all the user configurations:
Include /etc/apache2/httpd.conf
# Include ports listing
Include /etc/apache2/ports.conf
……
# Include generic snippets of statements
Include /etc/apache2/conf.d/
# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/

结合注释,可以很清楚地看出每个配置文件的大体作用。当然,你完全可以把所有的设置放在apache2.conf或者httpd.conf或者任何一个配置文件中。Apache2的这种划分只是一种比较好的习惯。
安装完Apache后的最重要的一件事就是要知道Web文档根目录在什么地方,对于Ubuntu而言,默认的是/var/www。怎么知道 的呢?apache2.conf里并没有DocumentRoot项,httpd.conf又是空的,因此肯定在其他的文件中。经过搜索,发现在 /etc /apache2/sites-enabled/000-default中,里面有这样的内容:
引用[php]
NameVirtualHost *

ServerAdmin webmaster @localhost
DocumentRoot /var/www/[/php]