http://memory.zol.com.cn/111/1111748.html
添加到whell组有两种方式:
1.修改在/etc/passwd
或者:vipw   将组改成0
找不到则:whereis vipw
cd到目录然后:vipw即可!

2.visudo
whereis visudo
然后:
# User alias specification
User_Alias      USER_G01 = yunfeng,hongliang1,mazhen,jianxin,xubin,xiangdong2


关于进入Mysql:


mysql> show databases'
    '> ;
    '>

由于'没有闭合,再输入';即可推出到:
mysql>(Ctrl+z)


terminal:
0> jobs -l
[1]   7787 Stopped                 mysql -h10.69.3.198 -P4406 -uqwe -p123 -A relation
[2]   8082 Stopped                 mysql -h10.69.3.198 -P4406 -uqwe -p123 -A relation

fg 1 or 2 回去!



并发编程:
<?php
//pup5新支持功能file_put_contents()
$content = '你好';
file_put_contents('file.txt',$content);
//file_put_contents($curl_url_info["error_log_file"],$url_get_str,FILE_APPEND);
//FILE_APPEND  追加写。。。

//输出json格式数据
$hello = array('1','2','3');
$helloJson = json_encode($hello);
//print_r($helloJson);
//exit;
echo <<<eot
<script language="JavaScript" type="text/JavaScript">
//在javascript中新建一个对象json_js,输出的代码为var json_js = ["1","2","3"];
var json_js = $helloJson;
//看看效果
//弹出窗口显示1
alert(json_js[0]);
alert(json_js[1]);
</script>
eot;
?>


———————————————————————————————————————————————————————————
最近有个项目需要用file_put_contents函数写txt文件,由于需要频繁操作,所以经常出现前半截内容缺失的情况,非常苦恼。

后来查询资料发现,file_put_contents函数有个参数LOCK_EX非常有用,加上它之后,再也没有出现过内容缺失的情况了。

这个参数LOCK_EX的意思很直白,就是写文件时,先锁上这个文件,这样只允许某个客户端访问的时候写,其他客户端访问不能写了。

我的用法如下:
file_put_contents($file, $content, FILE_APPEND|LOCK_EX)
解释:
$file=>这个是写入文件的路径+文件名
$content=>这个是写入文件的内容
FILE_APPEND=>直接在该文件已有的内容后面追加内容
LOCK_EX=>写文件的时候先锁定,防止多人同时写入造成内容丢失
  
摘自:http://www.wyxuan.com/184.html  


————————————————————————————————————————————————————————————————
PHP file_put_contents() 函数 写入txt文本函数:

定义和用法

file_put_contents() 函数把一个字符串写入文件中。

与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
语法

file_put_contents(file,data,mode,context)

参数   描述
file   必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。
data   可选。规定要写入文件的数据。可以是字符串、数组或数据流。
mode  

可选。规定如何打开/写入文件。可能的值:

    FILE_USE_INCLUDE_PATH
    FILE_APPEND
    LOCK_EX

context  

可选。规定文件句柄的环境。

context 是一套可以修改流的行为的选项。若使用 null,则忽略。
说明

参数 data 可以是数组(但不能是多维数组)。

自 PHP 5.1.0 起,data 参数也可以被指定为 stream 资源,stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。

对 context 参数的支持是 PHP 5.0.0 添加的。
返回值

该函数将返回写入到文件内数据的字节数。
提示和注释

提示:使用 FILE_APPEND 可避免删除文件中已有的内容。

注释:本函数可安全用于二进制对象。
例子

<?php
echo file_put_contents("test.txt","Hello World. Testing!");
?>
输出:
26

说明
参数 data 可以是数组(但不能是多维数组)。

自 PHP 5.1.0 起,data 参数也可以被指定为 stream 资源,stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。

对 context 参数的支持是 PHP 5.0.0 添加的。
返回值

该函数将返回写入到文件内数据的字节数。
提示和注释

提示:使用 FILE_APPEND 可避免删除文件中已有的内容。

注释:本函数可安全用于二进制对象。
来自:http://blog.sina.com.cn/s/blog_88441e630100tj60.html
1.新加通过curl的参数就知道是不是有bom在http头
2.对svn里加入 钩子来去掉里面的bom头。
3.对shell怎么去掉bom进行了摘录。   2013-08-14

  一同事在输出XML的时候在firefox下没有问题,在IE下提示:

文档的顶层无效。处理资源 'http://public.sina.com.cn/message/program/application/1.php?uid=1&group=0&status=2&charset=utf-8&datatype=xm...

<?xml version="1.0" encoding="UTF-8"?>
^


蒙了,我找了整个她的哪个输出的php程序,都没有发现问题,但是在我将源代码保存后,通过editplus查看的时候,发现前面有一个不明飞行物,于是经过一步一步的调试发现原来在底层的数据层有一个utf8编码的bom,通过editplus看不出来,通过zend for eclipse6.1.*也看不出来,但是可以通过vi zend studio看到这个玩意!
   vi  看到:  <feff>
   zend studio:看到一个小点。。。
   zend studio 通过gbk编码:出现: 锘�
这种问题可以通过:notepad++ 的转换功能给转换为没有bom即可,完毕!

再次追溯原因:
  通过svn查到,其出现这个原因是由于以下步骤操作导致的:
1.用记事本建立一个ansi的文本文件为phptest.php ,写入<?php  ?>用zend studio打开没有发现问题。
2.然后通过记事本打开,另存为utf-8.用zend studio打开发现问题,<?php 前面出现 锘� (GBK编码打开是这样,设为uft-8后出现一个小点。。。)。

总结:
最后,我用记事本建立ansi文件,然后写入<?php ?>,再用editplus打开,然后通过另存为utf8,没有发现改问题,看来确实是记事本的问题!
最好用editplus建立utf8文件,谢谢!

如有bom输出会在setcookie的时候出现下面错误:Cannot modify header information - headers already sent by ....
如果在setcookie之前输出了任何文本内容,便会有上述错误提示。由于页面头部require了若干文件,一行行排查是很麻烦的事情!
解决方法如下:
我在该页面顶部加上:
ob_start();

在setcookie之前加上代码:
ob_get_clean();

这是为了获取setcookie之前页面输出的内容。页面运行后,显示输出了一个空字符串,也就是说,setcookie之前没有任何输出。
避免方法:用vim打开了源文件,发觉vim有打开bomb选项,怀疑因此给代码添加了隐藏的字符串,关闭之: set nobomb






http://hi.baidu.com/jimmyhouse/blog/item/247dd517bb77040fc83d6d2f.html
http://www.phpq.net/research/php-utf8-bom.html
http://www.phpchina.com/html/80/t-37580.html



工作心得
对于上次邮件里面讨论到的PHP BOM问题,我来说来句就当心得吧,其实这个BOM问题一直在我们进行开发的时候经常出现,前些日子在企业邮箱里面第一次遇到这个问题,当时好像是企业的图标LOGO没有办法显示出来,因为<img src="img.php">,是img.php去读一个图片的内容然后给img显示,经过长仔细排查出现在输出图片资源前就有输出,那时候用的是notepad+editplus,最后用Zend studio来看这个文件头出现一个锘�字,证明了该问题。

第二次遇到BOM问题,是陈鑫鑫在纸条项目里面输出XML数据到IE浏览器中展现出现XML错误。

第三次也就是我们的记录APP调用外部接口返回用户的昵称出现乱码,经琳琳查也由BOM造成!
为何经常出现这种类似的问题,我看大家都在按照自己的方式来建立和开发PHP,特别是用Notepad来新建文件,系统默认在是ANSI格式,但我们的PHP编码是UTF-8的,于是又通过Notepad的另存为修改为UTF-8格式的,这样也就产生了一个BOM,最后,再用现在统一的开发工具Zend for eclipse去编辑这个带BOM的PHP文件,但BOM依然存在文件当中,它一般是表现不出任何问题,但一旦在页面前不能有输出的情况:如上面我遇到的三种情况它也就显现出来了。

BOM如此讨厌,该如何避免:
建议:
1.  切实统一开发工具:统一用Zend for eclipse 来新建PHP文件,和修改PHP文件编码!
2.  在项目完成后对目录里面所有的PHP 文件进行遍历驱出有可能出现的BOM。如:用sed批量替换掉bom:(syscore目录和所有下级目录的PHP文件替换)  
find ./syscore -type f -name "*.php" -exec sed -i '1s/^\xef\xbb\xbf//' {}  \;




<?
//此文件用于快速测试UTF8编码的文件是不是加了BOM,并可自动移除
//By Bob Shen

$basedir="./paper/tech/trunk/message"; //修改此行为需要检测的目录,点表示当前目录
$auto=0; //是否自动移除发现的BOM信息。1为是,0为否。

//以下不用改动

if ($dh = opendir($basedir)) {
while (($file = readdir($dh)) !== false) {
if ($file!='.' && $file!='..' && !is_dir($basedir."/".$file)) echo "filename: $file ".checkBOM("$basedir/$file")." <br>";
}
closedir($dh);
}

function checkBOM ($filename) {
global $auto;
$contents=file_get_contents($filename);
$charset[1]=substr($contents, 0, 1);
$charset[2]=substr($contents, 1, 1);
$charset[3]=substr($contents, 2, 1);
if (ord($charset[1])==239 && ord($charset[2])==187 && ord($charset[3])==191) {
if ($auto==1) {
$rest=substr($contents, 3);
rewrite ($filename, $rest);
return ("<font color=red>BOM found, automatically removed.</font>");
} else {
return ("<font color=red>包含BOM</font>");
}
}
else return ("未发现BOM");
}

function rewrite ($filename, $data) {
$filenum=fopen($filename,"w");
flock($filenum,LOCK_EX);
fwrite($filenum,$data);
fclose($filenum);
}
?>






<?php  
  /*
  
  查找一个目录里面的UTF-8 Born 头

  用法
    /opt/bin/php GetUtf8Born.php {dir}

  例如
    /opt/bin/php GetUtf8Born.php /opt/www/

  */

  $is_fix_file = 1; //定义是否修复文件 1 为不修复 2 为修复
  
  
  $d = $_SERVER['argv'][1];

  if (!is_dir($d)) exit("Not Dir\n");

  $shell = "/usr/bin/find $d -type f";

  $r = exec($shell, $s_r);

  if(!empty($s_r))
  {
    foreach($s_r as $file)
    {
      if(GetBorn($file))
      {
        echo $file . "\n";

        if($is_fix_file == 2)
        {
          FixBorn($file);
        }
      }
    }
  }
  
  
  exit;

  function FixBorn($file)
  {
    if(!is_file($file))
    {
      return false;
    }
    
    $file_base_name = basename($file);
    
    $file_path = dirname($file);

    $r = ReadF($file, $file_string);

    if(!$r)
    {
      return false;
    }

    //Utf-8 头占用3个字符占位 去掉即可
    $new_string = substr($file_string, 3);

    //开始备份文件
    if (!copy($file, $file_path . "/Utf8Bom_" . $file_base_name))
    {
      return false;
    }

    // 写入新文件
    if(!WriteF($file, $new_string))
    {
      return false;
    }

    return true;

  }
  
  function ReadF($file, &$string)
  {
    $fp = fopen($file, "r");

    if(!$fp)
    {
      return false;
    }
    
    while (!feof ($fp))
    {
      $string  .= fgets($fp, 1024);
    }
  
    fclose($fp);

    return true;
  }

  function WriteF($file, $string)
  {
    $fp = fopen($file, "w+");

    if(!$fp || !is_writable($file))
    {
      return false;
    }
    
    if (!fwrite($fp, $string))
    {
      return false;
    }
  
    fclose($fp);

    return true;

  }
  
  function GetBorn($file)
  {
    if(!is_file($file))
    {
      return false;
    }

    $fp = fopen($file, "r");

    $s = fgets($fp, 64);
    
    fclose($fp);

    $s = trim(bin2hex($s));
    
    //if (strpos($s, "efbbbf") !== false)

    if (substr($s, 0, 6) == "efbbbf")
    {
      return true;
    }

    return false;
  }
?>


补充:
bluexchen(陈胜益) 17:44:39

<?php

$aa = headers_sent();
var_dump($aa);


session_start();
if (isset($_SESSION['test_sess'])){
     $_SESSION['test_sess']++;
}else{

     $_SESSION['test_sess'] = 0;
}
echo $_SESSION['test_sess'];
?>;





一:
用Shell如何清除一个目录下所有带BOM的文件中的BOM信息:
在Linux下的SVN中的文件,可能由于开发人员的编辑器的问题,上传上来后的文件带有utf8的BOM,会造成页面访问的问题,现在需要一个shell命令,一键清除一个目录下所有带BOM的文件中的BOM信息。
grep -r -I -l $'^\xEF\xBB\xBF' /path | xargs sed -i 's/^\xEF\xBB\xBF//g'
来自:http://www.dewen.org/q/4111

二:
使用Shell去除BOM:
发现有些文档在Shell下面处理的时候,第一个字节总是无法正常显示,出现乱码. 后来发现原来是BOM在作怪,BOM一共占用了3个字节. 通过UE可以在保存的时候,选择不保存BOM来去除.

但是我既然是在Linux下面做处理,为什么不直接通过Shell脚本来处理呢.查了资料之后发现下面的命令可以实现.
echo -ne '\xef\xbb\xbf123456' | awk '{if(NR==1)sub(/^\xef\xbb\xbf/,""); print}'

-ne是确保可以打印出16进制
\xef\xbb\xbf是UTF8 BOM的16进制表示
awk 后面命令意思就是,如果第一行是以UTF8 的BOM开头,则去除

BOM的详细解释
http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html

来自:http://flyfoxs.iteye.com/blog/1485713



shell> curl -s http://phone.10086.cn/ | head -1 | sed -n l
\357\273\277<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional\
//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r$

如上所示,前三个字节分别是357、273、277,这就是八进制的BOM。


curl -s http://phone.10086.cn/ | head -1 | hexdump -C
00000000  ef bb bf 3c 21 44 4f 43  54 59 50 45 20 68 74 6d  |...<!DOCTYPE htm|
00000010  6c 20 50 55 42 4c 49 43  20 22 2d 2f 2f 57 33 43  |l PUBLIC "-//W3C|
00000020  2f 2f 44 54 44 20 58 48  54 4d 4c 20 31 2e 30 20  |//DTD XHTML 1.0 |
00000030  54 72 61 6e 73 69 74 69  6f 6e 61 6c 2f 2f 45 4e  |Transitional//EN|
00000040  22 20 22 68 74 74 70 3a  2f 2f 77 77 77 2e 77 33  |" "http://www.w3|
00000050  2e 6f 72 67 2f 54 52 2f  78 68 74 6d 6c 31 2f 44  |.org/TR/xhtml1/D|
00000060  54 44 2f 78 68 74 6d 6c  31 2d 74 72 61 6e 73 69  |TD/xhtml1-transi|
00000070  74 69 6f 6e 61 6c 2e 64  74 64 22 3e 0d 0a        |tional.dtd">..|

如上所示,前三个字节分别是EF、BB、BF,这就是十六进制的BOM。


注:用到了第三方网站的页面,不能保证例子始终可用。 实际做项目开发时,可能会面对成百上千个文本文件,如果有几个文件混入了BOM,那么很难察觉,如果没有带BOM的UTF-8文本文件,可以用vi杜撰几个,相关命令如下:

设置UTF-8编码:

:set fileencoding=utf-8

添加BOM:

:set bomb

删除BOM:

:set nobomb

查询BOM:

:set bomb?

如何检测UTF-8编码中的BOM呢?

shell> grep -r -I -l $'^\xEF\xBB\xBF' /path

如何删除UTF-8编码中的BOM呢?

shell> grep -r -I -l $'^\xEF\xBB\xBF' /path | xargs sed -i 's/^\xEF\xBB\xBF//;q'

推荐:如果你使用SVN的话,可以在pre-commit钩子里加上相关代码用以杜绝BOM。

#!/bin/bash

REPOS="$1"
TXN="$2"

SVNLOOK=/usr/bin/svnlook

for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[AU]/ {print $NF}'); do
    if $SVNLOOK cat -t "$TXN" "$REPOS" "$FILE" | grep -q $'^\xEF\xBB\xBF'; then
        echo "Byte Order Mark be found in $FILE" 1>&2
        exit 1
    fi
done

来自:http://huoding.com/2011/05/14/78
        private function setQueue($data,$q="MultiMsgSend") {
            $str_url = 'http://10.210.71.85/send_message.php';
            $data = "queuename={$q}&queuedata={$data}";
      
            $ch_curl = curl_init ();
            curl_setopt ( $ch_curl, CURLOPT_TIMEOUT, 3 );
            curl_setopt ( $ch_curl, CURLOPT_HEADER, false );

            curl_setopt($ch_curl,CURLOPT_POST,TRUE);
            curl_setopt($ch_curl,CURLOPT_POSTFIELDS,$data);
            curl_setopt ( $ch_curl, CURLOPT_RETURNTRANSFER, true );
            curl_setopt ( $ch_curl, CURLOPT_URL, $str_url );
      
            $str_return = curl_exec ( $ch_curl );
      
            if ($str_return === false)
            {
                $this->setErrorNo(11);
                return false;
            }
            curl_close ( $ch_curl );
            return true;
        }

发现MySQL的explain还是很有迷惑性的。

看下面两个sql的explain,(i,j)是tt的主键


mysql> explain select * from tt where i between 3 and 5 and j = 4\G
*************************** 1. row ***************************
          id: 1
select_type: SIMPLE
       table: tt
        type: range
possible_keys: PRIMARY
         key: PRIMARY
     key_len: 8
         ref: NULL
        rows: 8
       Extra: Using where; Using index
1 row in set (0.00 sec)

mysql> explain select * from tt where i > 2 and i < 6 and j = 4\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tt
         type: range
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 8
        Extra: Using where; Using index
1 row in set (0.00 sec)

看上去如果使用了between,那么MySQL可以用的索引的两列。但仔细的研究了一下,发现实际并不是这样。between 3 and 5可以写为(i>3 or i=3) and (i<5 or i=5),是这两个等号使用了两列,而大于和小于的判断仍然是index扫描,只用了一列。

再看另一个

mysql> explain select * from tt where i in (3,4,5) and j=4\G
*************************** 1. row ***************************
          id: 1
select_type: SIMPLE
       table: tt
        type: range
possible_keys: PRIMARY
         key: PRIMARY
     key_len: 8
         ref: NULL
        rows: 3
       Extra: Using where; Using index
1 row in set (0.00 sec)

这个才是真正用了两列,可以看到这里估计的行数是3,而刚才两个是8。用 show status 可以看得更清楚一些:

mysql> show status like 'handler_read%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_first    | 0     |
| Handler_read_key      | 0     |
| Handler_read_next     | 0     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 0     |
+-----------------------+-------+
6 rows in set (0.00 sec)

mysql> select * from tt where i in (3,4,5) and j=4;
+---+---+
| i | j |
+---+---+
| 3 | 4 |
+---+---+
1 row in set (0.00 sec)

mysql> show status like 'handler_read%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_first    | 0     |
| Handler_read_key      | 4     |
| Handler_read_next     | 1     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 0     |
+-----------------------+-------+
6 rows in set (0.00 sec)

mysql> select * from tt where i between 3 and 5 and j = 4;
+---+---+
| i | j |
+---+---+
| 3 | 4 |
+---+---+
1 row in set (0.00 sec)

mysql> show status like 'handler_read%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_first    | 0     |
| Handler_read_key      | 6     |
| Handler_read_next     | 10    |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 0     |
+-----------------------+-------+
6 rows in set (0.00 sec)

后一个sql中有9次read_next_key,说明做了索引扫描。
由于zend for eclipse6.1.0 没有php_memcache.dll这个动态链接库,我们在phpunit测试的时候会报找不到php_memcache类的错,于是只需要把php_memcache.dll(对应版本的:php_memcache.dll)放入:D:\Program Files\Zend\Zend Studio for Eclipse - 6.1.0\plugins\org.zend.php.debug.debugger.win32.x86_5.2.14.v20080602\resources\php5\ext\php-cgi.exe,然后修改D:\Program Files\Zend\Zend Studio for Eclipse - 6.1.0\plugins\org.zend.php.debug.debugger.win32.x86_5.2.14.v20080602\resources\php5\php.ini   加入一行:extension=php_memcache.dll  ,重新启动zend for eclipse6.1.0即可!
http://blog.s135.com/apmserv/bin/5.2.6/sina/


D:\Program Files\Zend\Zend Studio for Eclipse - 6.0.1\plugins\org.zend.php.debug.debugger.win32.x86_5.2.14.v20080602\resources\php5\ext
加密日志
这篇日志被加密了。请输入密码后查看。
密码
首先要澄清一个流毒广泛的说法:大学毕业第一份工作不重要。
  这绝对是极其错误的。它给了大学毕业生一个错误的认识,对相当一部分人造成了无可挽回的损失!大学生就业选择,是对一个人十年内的生活产生重大影响的关键决策,是极其重要的。
  那么找怎么样的工作比较好?什么样的行业算好?大公司好还是小公司好?如何正确的理解当前工资和未来发展?一系列的问题摆在大学生的面前。下面我首先对要考虑的宏观策略问题进行分析,然后再进行个别具体问题的解答。
  一、中国现阶段职场利益集团划分
  这才是一个大学毕业生首先要知道的大问题。学校的主任不会和你说的,公司招聘时也不会和你说的,因为利益只有少部分人能够分到;你父母也不一定会和你说的,因为他们很可能也是糊涂的。如果这一部分已经有人很明确的告诉你了,或者你个人已经很敏锐的感知到了,那么恭喜你!你已经可以关闭这篇文章了,因为你已经是明白人,不需要我浪费口舌。
  (一)5大利益象限
  中国的社会处在重要的转型变化中:由计划经济转向“有中国特色的市场经济”。这个过程是一个利益格局的重新分配的过程。在就业市场上,我们可以按大的方面对各种利益单位归类如下:
  1.公务员(含事业单位)
  2.垄断行业国企
  3.竞争行业国企
  4.外企
  5.民营企业阅读全文
加密日志
这篇日志被加密了。请输入密码后查看。
密码
    女人是做电子罗盘的。每天研究陀螺仪,水平仪,角度传感器,加速度传感器喝倾角传感器。这天突接到通知,需要再加两个小时的班。女人给男人打电话,告诉他可能得晚一点儿回家。男人说,嗯,我也刚下班,在路上,你大约什么时间回来?女人刚想告诉他还得两个小时,手机就没电了。女人想找个公用电话,再想想还是算了。老夫老妻了,儿子都读了中学,还用如此浪漫?  

  终于下了班,女人匆匆往家赶。已经很晚了,她想这时男人一定候在客厅,把空调开得很暖。餐桌上应该还摆了温热的饭菜,肯定有女人喜欢的那道。想到这里,女人笑了,加快了脚下的步子。却突然,在离家二十多米远的地方,她看到了男人。
  男人站在黑暗里,只是一个模糊的灰色轮廓。但她知道那是男人。女人对男人太熟悉了,熟悉到可以辨认出他的一根发丝,一个喷嚏,一缕气味,甚至一个影子。女人轻声说,嗨。男人就走过来,他说怎么现在才回来?好像男人正发着抖。天很冷,夜风把人的衣服,一点一点地刮透。
  女人说你在这里干什么?男人说有条沟……记得早晨还没有沟呢……可能在抢修煤气管道……他们也不亮个警示灯……你得从这边绕过来。男人领着女人,小心翼翼地绕过那条沟。女人说你等在这里,就为了告诉我有一条沟?男人说是。这么冷的天,万一摔一跤,可不是好玩的。男人低头上了楼梯,声控灯忽明忽暗。突然,女人觉得男人像一个热恋中的男孩,寒风中,正忐忑不安地等着他的心上人。
  进了屋子,男人急急地去开空调,急急地从冰箱里拿出冻鱼冻肉。女人愣一下,她说你一直没有回家?男人说是啊。女人说下了班,你就一直等在那里?男人说是啊,本想打电话告诉你小心点,可是你手机没电了。女人说你在那里等了两个多小时?怎么不先回家取取暖?男人说万一我回来的时候,你也刚好回家呢?沟那么深,又没亮个警示灯……晚饭想吃红烧肉吗?女人说从那里回趟家添一件衣服,不过两三分钟,你怕我在这两三分钟内回来,就一直不敢离开?男人说是啊是啊……吃不吃红烧肉?
  女人有些感动。好像男人并不像热恋中的小男孩。他是一个深沉细心的父亲。男人的鼻子红红的,突然打一个响亮的喷嚏。女人走过去,从男人的手上抢过围裙。突然她发现男人咧了嘴巴,眉头轻轻地皱。女人忙撸开他的裤腿,她发现男人的膝盖鲜血淋漓。女人说你快去歇着,找个创可贴贴上。男人笑笑说不用了,两个多小时,早已经长痂了……我说你到底吃不吃红烧肉?
  爱情是什么呢?应该不是那种年年月月天天时时分分秒秒的相守吧?其实真正动人的爱情,只是在某一个时刻,只是在某一个最微小的时刻,一秒钟,都不敢离开。

<?php
/**
* 倒库程序雏形,将space的数据分析后导入到现有数据库中
*
*/
class import_export
{
  private  $dsn="";
  private  $user="";
  private  $password="";
  private  $pdo="";
  
  public function import_export($dsn,$user,$password)
  {
    $this->dsn = $dsn;
    $this->user = $user;
    $this->password = $password;
    $this->pdo = new PDO($this->dsn, $this->user, $this->password);
  }
  
  public function fetch_result($query)
  {
    $rs = $this->pdo->query($query);
    $result_arr = $rs->fetchAll();
    return $result_arr;
    
    
  }
  
  public function insert($insert_sql)
  {
    $count = $this->pdo->exec($insert_sql);
    if($count)
    {
      return true;
    }else{
      return false;      
    }
  }
  
  public function get_pdo_obj()
  {
    return $this->db;
  }
  
  public function lastInsertId()
  {
    return $this->pdo->lastInsertId();
    
  }
}
?>
<?php
$time_begin = time();
$conf_array = array("db_host"=>"localhost","port"=>"3306","dbname"=>"public","user"=>"root","password"=>"");
$dsn = "mysql:host={$conf_array['db_host']};port={$conf_array['port']};dbname={$conf_array['dbname']}";
$user = $conf_array['user'];
$password = $conf_array['password'];
$pdo = new import_export($dsn,$user,$password);
for($i=1;$i<100000000000;$i++)
{
  $time_end = time();
  if($time_end - $time_begin >= 60)
  {
    exit;
  }
  $insert_sql = "INSERT INTO `information` ( `infoid` , `group` , `productid` , `connection` , `invitetype` , `content` , `addition` ) VALUES (NULL , '1', '2', '2', '1', '的的的的的的的的的的的的的的的的的的', '的的的的的的的的的的的的的的的的的的的的的的的的');"; //插入数据库的sql语句
  $import_export2 = $pdo->insert($insert_sql);
  $insert_id = $pdo->lastInsertId();
  $insert_sql2 = "INSERT INTO `relation` ( `id` , `owneruid` , `otheruid` , `type` , `status` , `infoid` , `ctime` , `uniq_key` ) VALUES (NULL , '1', '2', '1', '11', $insert_id, '2008-10-02 20:30:21', '45646546456456456456456456456456465');"; //插入数据库的sql语句
  $import_export2 = $pdo->insert($insert_sql2);
  
}
?>


阅读全文
查询当前数据库有哪些存储过程:

mysql>show procedure status where Db='test'

创建一个简单的存储过程


mysql>create procedure hi() select 'hello';


  5 存储过程创建完毕,看怎么调用它


mysql>call hi();

  显示结果 
 mysql> call hi();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)
  Query OK, 0 rows affected (0.01 sec)



删除存储过程:

DROP PROCEDURE hi;


存储过程实例:

DELIMITER ||
CREATE PROCEDURE showdb( v_offset int, v_pagesize int )  
BEGIN
  SET @stmt = concat("SELECT * FROM  `comment` ORDER BY id DESC LIMIT ",v_offset,",",v_pagesize);
  PREPARE s1 FROM @stmt;
  EXECUTE s1;
  DEALLOCATE PREPARE s1;
END||
DELIMITER ;


PHP调用存储过程:
返回单个数据:
1.1:创建MySQL存储过程:


DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`proc_test` $$
CREATE PROCEDURE `test`.`proc_test` (out a int)
BEGIN
    select count(*) into a from tblname;
END $$

DELIMITER ;


1.2:PHP调用:


$db->query("CALL test.proc_test(@a)");
$res = $db->query("select @a");
$row = $res->fetch_array();
echo $row['@a'];


返回多个数据:
2.1:创建MySQL存储过程:


DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`proc_test` $$
CREATE PROCEDURE `test`.`proc_test` ()
BEGIN
    select * from tbl_name;
END $$

DELIMITER ;


2.2:PHP调用:


$res=$db->query("CALL test.proc_test()");
while ($arr=$res->fetch_array())
{
    echo $arr["Field"] ."<br/>";
}


P.S.:以上代码执行通过环境 PHP 5.X.X + MySQL 5.X.X



1 define('CLIENT_MULTI_RESULTS', 131072);
2
3 $link = mysql_connect("127.0.0.1", "root", "",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());

下面就可以正常使用了,以下是例子程序:


1 <?php
2     define('CLIENT_MULTI_RESULTS', 131072);
3
4     $link = mysql_connect("127.0.0.1", "root", "",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
5     mysql_select_db("vs") or die("Could not select database");
6 ?>
7
8 <?php
9         $result = mysql_query("call get_news_from_class_id(2)") or die("Query failed:" .mysql_error());
10         while($row = mysql_fetch_array($result, MYSQL_ASSOC))
11         {
12                 $line = '<tr><td><a target = _blank href=\''.$row["url"].'\'>'.$row["title"].'('.$row["page_time"].')'.'</a></td></tr>';
14                 echo $line;
15                 printf("\n");
16
17         }
18         mysql_free_result($result);
19 ?>
20
21 <?php
22     mysql_close($link);
23 ?>
最近在做一个小东西的时候,发现mysql有last_insert_id()这个函数

它的用法如下:记录下来备忘

它必需紧跟在insert 语句执行之后。

//执行insert语句先

$sql="insert into table (name1,name2,...) values('value1','values'...)";

dbx_query($db_link,$sql);

//找出最后一次插入记录的id

$select="select last_insert_id() ";

$result=dbx_query($db_link,$select);

$last_id=$result->data[0][0];


ps: $last_id=mysql_insert_id();

mysql_insert_id() 将 MySQL 内部的 C API 函数 mysql_insert_id() 的返回值转换成 long(PHP 中命名为 int)。如果 AUTO_INCREMENT 的列的类型是 BIGINT,则 mysql_insert_id() 返回的值将不正确。可以在 SQL 查询中用 MySQL 内部的 SQL 函数 LAST_INSERT_ID() 来替代。

具体的请看php手册: mysql_insert_id

来自:http://blog.csdn.net/kemy88/article/details/1108524








_____________________________________________________________________________
show table status\G
show create table message;
LAST_INSERT_ID

自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值. 参考这里

The ID that was generated is maintained in the server on a per-connection basis.

LAST_INSERT_ID是基于单个connection的, 不可能被其它的客户端连接改变。

可以用 SELECT LAST_INSERT_ID(); 查询LAST_INSERT_ID的值.

Important: If you insert multiple rows using a single INSERT statement, LAST_INSERT_ID() returns the value generated for the first inserted row only.

使用单INSERT语句插入多条记录,  LAST_INSERT_ID只返回插入的第一条记录产生的值. 比如


   1. mysql> INSERT INTO t VALUES (NULL, 'aaaa'), (NULL, 'bbbb'), (NULL, 'cccc');  
   2. mysql> SELECT * FROM t;  
   3. +----+------+  
   4. | id | name |  
   5. +----+------+  
   6. |  1 | Bob  |  
   7. |  2 | aaaa |  
   8. |  3 | bbbb |  
   9. |  4 | cccc |  
  10. +----+------+  
  11. mysql> SELECT LAST_INSERT_ID();  
  12. +------------------+  
  13. | LAST_INSERT_ID() |  
  14. +------------------+  
  15. |                2 |  
  16. +------------------+  


ID 2 是在插入第一条记录aaaa 时产生的.

LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。

但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。

这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。

mysql的last_insert_id()不可靠 Mysql的API有个很有意义的函数last_insert_id()。这个函数的作用是,针对auto_increment字段,返回给定的 数据库链接,上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定数据库链接,则使用上一个打开的连接。   很多人质疑last_insert_id()是否是可靠的,以前我也犹豫过。   事实上的结果是mysql_insert_id决不会取错。首先做个测试,在mysql_query("insert.....);之后立刻sleep(1100),其间再做些其他的insert. 然后发现在mysql_insert_id取的值都不会和其他的冲突。   看了半天mysql的代码。mysql_insert_id是这么定义的

my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql) {   return mysql->;last_used_con->;insert_id; }


参考:http://zhaohe162.blog.163.com/blog/static/38216797201122411193745/
语法如下:

alter table table_name add index index_name (column_list) ;
alter table table_name add unique (column_list) ;
alter table table_name add primary key (column_list) ;

alter table table_name drop index index_name ;
alter table table_name drop primary key ;
drop index shili on tpsc ;
来源URL:http://www.isstudy.com/mysql/440.html
实际实践如下:

alter table `relation` drop index gots;   alter table `relation` drop index gots;  
alter table `relation` add index gots(`group`,`owneruid`, `type`,`status`);



create table index_analyse_xiangdong select * from relation limit 21000;
show index from  p2p_main;  //p2p_main 是表名称


mysql> show index from  p2p_main;      
+----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table    | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| p2p_main |          0 | PRIMARY     |            1 | id          | A         |     3052412 |     NULL | NULL   |      | BTREE      |         |
| p2p_main |          1 | oweneruid   |            1 | oweneruid   | A         |      610482 |     NULL | NULL   |      | BTREE      |         |
| p2p_main |          1 | oweneruid_2 |            1 | oweneruid   | A         |      610482 |     NULL | NULL   |      | BTREE      |         |
| p2p_main |          1 | oweneruid_2 |            2 | otheruid    | A         |     1017470 |     NULL | NULL   |      | BTREE      |         |
+----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+




alter table `p2p_main` add index oweneruid_2(oweneruid ,otheruid );//建立索引,括号里面不能有逗号和单引号
alter table `p2p_main` drop index oweneruid_2; //删除索引:是建立在oweneruid 和otheruid 的联合索引



explain SELECT SQL_NO_CACHE * FROM `mytest` force index(rstatus,uid) WHERE  rstatus =1 AND uid IN ( 3,2,7) \G;





测试用数据表结构如下:
--

-- 表的结构 `p2p_info`
--

CREATE TABLE IF NOT EXISTS `p2p_info` (
  `infoid` int(10) unsigned NOT NULL auto_increment,
  `group` enum('1','2') collate utf8_bin NOT NULL,
  `productid` char(32) collate utf8_bin NOT NULL,
  `connection` enum('11','22') collate utf8_bin NOT NULL,
  `invitetype` enum('111','222') collate utf8_bin NOT NULL,
  `content` text collate utf8_bin NOT NULL,
  `addition` text collate utf8_bin NOT NULL,
  PRIMARY KEY  (`infoid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- 表的结构 `p2p_main`
--

CREATE TABLE IF NOT EXISTS `p2p_main` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `oweneruid` int(11) NOT NULL,
  `otheruid` int(11) NOT NULL,
  `type` enum('1','2') NOT NULL default '1',
  `status` enum('11','22') NOT NULL default '11',
  `infoid` int(11) NOT NULL,
  `ctime` datetime NOT NULL,
  `uniq_key` varchar(64) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;




1.PRIMARY  KEY(主键索引)
mysql>ALTER  TABLE  `table_name`  ADD  PRIMARY  KEY (  `column`  )
2.UNIQUE(唯一索引)
        mysql>ALTER  TABLE  `table_name`  ADD  UNIQUE (
`column` )   //这个不靠谱


alter table `index_analyse_xiangdong` ADD UNIQUE key id4(id);
alter table index_analyse_xiangdong drop index id4;


3.INDEX(普通索引)
mysql>ALTER  TABLE  `table_name`  ADD  INDEX index_name (  `column`  )
4.FULLTEXT(全文索引)
mysql>ALTER  TABLE  `table_name`  ADD  FULLTEXT ( `column` )
5.多列索引
mysql>ALTER  TABLE  `table_name`  ADD  INDEX index_name (  `column1`,  `column2`,  `column3`  )



可以用sql强制使用或不使用索引
IGNORE INDEX (invitetype)
USE INDEX (invitetype)

select count  from p2p_info1 IGNORE INDEX (invitetype) where invitetype="111";
建表:

CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB;
ALTER TABLE et ENGINE = INNODB;.
查看引擎状态:
show engines;

查看表类型(存储引擎): SHOW TABLE STATUS FROM test;
SHOW variables like "have_%"

用innodb引擎。使用方法是create table xxx()engine=innodb;如果想所有建立的表格都用innodb引擎,可以把“default-storage- engine=INNODB”加到/etc/mysql/my.cnf(位置可能不同)。设完之后就可以用“show engines;”检查是否设置好。不过据说该设置在5.0.22下可能无效。


http://www.geekso.com/post/124/

事务处理:

ySQL 总是启动自动提交你运行的每个 SQL 语句的自动提交(autocommit)模式创建每的新连接。为了使用事务,可以使用 SQL 命令 SET AUTOCOMMIT = 0 关闭自动提交(autocommit)开关,使用 COMMIT 和 ROLLBACK 来提交事务和回滚事务。如果你想保留 autocommit 开关打开,你可以将事务放入 BEGIN 和 COMMIT 或 ROLLBACK之间。

heikki@hundin:~/mysql/client> mysql test

Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 5 to server version: 3.23.50-log

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) TYPE = InnoDB;
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO CUSTOMER VALUES (10, 'Heikki');
Query OK, 1 row affected (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO CUSTOMER VALUES (15, 'John');
Query OK, 1 row affected (0.00 sec)

mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM CUSTOMER;
+------+--------+
| A      | B        |
+------+--------+
| 10     | Heikki |
+------+--------+
1 row in set (0.00 sec)



分页: 269/339 第一页 上页 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 下页 最后页 [ 显示模式: 摘要 | 列表 ]