zoukankan      html  css  js  c++  java
  • Yii 1 数据库操作 笔记

    $result = array(
        'id'=>null,
        'val'=>0
    );
    $row1 = Yii::app()->db->createCommand()->insert('test1', $result);
    $id   = Yii::app()->db->getLastInsertID();
    $row2 = Yii::app()->db->createCommand()->update('test1', array('val'=>$id) , 'id=:id',array(':id'=>$id));
    echo $id;
    exit;
    <?php
    #1. 建立数据库连接 可以使用  try...catch 捕获可能抛出的异常
    #$connection=new CDbConnection($dsn,$username,$password);
    #   DSN格式
    #   SQLite: sqlite:/path/to/dbfile
    #   MySQL: mysql:host=localhost;dbname=testdb
    #   PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
    #   SQL Server: mssql:host=localhost;dbname=testdb
    #   Oracle: oci:dbname=//localhost:1521/testdb
    #在配置文件里面修改别名
    #array(
    #    'components'=>array(
    #        'db'=>array(
    #            'class'=>'CDbConnection',
    #            'connectionString'=>'mysql:host=localhost;dbname=testdb',
    #            'username'=>'root',
    #            'password'=>'password',
    #            'emulatePrepare'=>true,  // needed by some MySQL installations
    #        ),
    #    ),
    #)
    #然后使用这种方式来建立连接
    
    #然后我们就可以通过 
    $connection = Yii::app()->db 
    #访问数据库连接了。它已经被自动激活了,除非我们特意配置了 
    #CDbConnection::autoConnect 为 false。
    # 通过这种方式,这个单独的DB连接就可以在我们代码中的很多地方共享。
    # 如果没有,你可能需要显式建立一个连接:
    # $connection=new CDbConnection($dsn,$username,$password);
    #$connection->active=true;  # 建立链接之后active为true;
    $connection->active=false;  # 关闭连接
    #运行SQL
    $command=$connection->createCommand($sql);
    #SQL修改
    $command->text = $newSQL;
    #########################################################
    #execute()方法用来执行 INSERT, UPDATE 和 DELETE 。如果成功,它将返回此执行所影响的行数。
    #query() 方法执行一条会返回若干行数据的 SQL 语句,例如 SELECT。
    #如果成功,它将返回一个CDbDataReader 实例,通过此实例可以遍历数据的结果行。
    #为简便起见, (Yii)还实现了一系列 queryXXX() 方法以直接返回查询结果
    #如果SQL发生错误,将会抛出一个异常。.
    $rowCount   =    $command->execute();                # 执行无查询 SQL
    $dataReader =    $command->query();                  # 执行一个 SQL 查询
    $rows       =    $command->queryAll();               # 查询并返回结果中的所有行
    $row        =    $command->queryRow();               # 查询并返回结果中的第一行
    $column     =    $command->queryColumn();            # 查询并返回结果中的第一列
    $value      =    $command->queryScalar();            # 查询并返回结果中第一行的第一个字段
    #########################################################
    #获取查询结果
    #在生成 CDbDataReader后
    #重复调用 CDbDataReader::read()
    #也可以在 foreach 语言结构中使用 CDbDataReader
    
    ####例如####
    $dataReader = $command->query();
    
    #方法1 重复调用 read() 直到它返回 false
    while( ($row = $dataReader->read()) !== false) { ... }
    #方法2 使用 foreach 遍历数据中的每一行
    foreach($dataReader as $row) { ... }
    #方法3 一次性提取所有行到一个数组
    $rows = $dataReader->readAll();
    
    #注意: 
    #所有的 queryXXX() 方法会直接返回数据
    #query()却不会,返回的是一个CDbDataReader 的实例
    
    #使用事务
    $transaction= $connection->beginTransaction();
    try
    {
        $connection->createCommand($sql1)->execute();
        $connection->createCommand($sql2)->execute();
        #其他
        $transaction->commit();
    }
    catch(Exception $e) # 如果有一条查询失败,则会抛出异常
    {
        $transaction->rollBack(); #回滚
    }
    
    
    #########################################################
    
    #预处理(参数绑定)  避免注入 提高重复执行的效率
    #占位符可以是命名的 (表现为一个唯一的标记) 或未命名的 (表现为一个问号)。占位符将被替换为实际的参数。
    #调用 CDbCommand::bindParam() 或 CDbCommand::bindValue() 以使用实际参数替换这些占位符。 
    #这些参数不需要使用引号引起来:底层的数据库驱动会为你搞定这个参数绑定必须在 SQL 语句执行之前完成。
    ##例
    #一条带有两个占位符 ":username" 和 ":email"的 SQL
    
    $sql="INSERT INTO tbl_user (username, email) VALUES(:username,:email)";
    $command = $connection->createCommand($sql);
    
    #用实际的用户名替换占位符 ":username" 
    $command->bindParam(":username",$username,PDO::PARAM_STR);
    
    #用实际的 Email 替换占位符 ":email" 
    $command->bindParam(":email",$email,PDO::PARAM_STR);
    $command->execute();
    
    #重复执行同一个逻辑的时候
    #使用新的参数集插入另一行
    $command->bindParam(":username",$username2,PDO::PARAM_STR);
    $command->bindParam(":email",$email2,PDO::PARAM_STR);
    $command->execute();
    #bindParam() 和 bindValue() 非常相似。
    #唯一的区别就是前者使用一个 PHP 变量绑定参数, 
    #而后者使用一个值。对于那些内存中的大数据块参数,处于性能的考虑,应优先使用前者。
    #########################################################
    #绑定列
    $sql="SELECT username, email FROM tbl_user";
    $dataReader=$connection->createCommand($sql)->query();
    #使用 $username 变量绑定第一列 (username) 
    $dataReader->bindColumn(1,$username);
    #使用 $email 变量绑定第二列 (email) 
    $dataReader->bindColumn(2,$email);
    while($dataReader->read()!==false)
    {
        #$username 和 $email 含有当前行中的 username 和 email 
        #这里就不用每次都给两个变量赋值了
    }
    #########################################################
    #使用表前缀
    #配置 CDbConnection::tablePrefix 属性为所希望的表前缀。 
    #array(
    #    'components'=>array(
    #        'db'=>array(
    #            'class'=>'CDbConnection',
    #            'connectionString'=>'mysql:host=localhost;dbname=testdb',
    #            'username'=>'root',
    #            'password'=>'password',
    #            'emulatePrepare'=>true,  // needed by some MySQL installations
    #            'tablePrefix'=>"表前缀_"
    #        ),
    #    ),
    #)
    $sql='SELECT * FROM {{user}}';
    $users=$connection->createCommand($sql)->queryAll();
    
    
    ######################
    
    $user = Yii::app()->db->createCommand()
            ->select('username, password')
            ->from('tbl_user')
            ->where('id=:id', array(':id'=>1))
            ->queryRow();
    
    
    
    where() 方法 (可用自 v1.1.6public CDbCommand where(mixed $conditions, array $params=array ( ))
    
    $conditions    mixed    放在WHERE部分的条件。
    $params    array    绑定到此查询的参数 (name=>value)
    {return}    CDbCommand    返回此命令对象本身
    
    设置查询的WHERE。 
    
    这个方法要求一个 $conditions 参数和一个 $params 参数, 指定值绑定到查询。 
    
    $conditions 参数可以是一个字符串(例如 'id=1')或一个数组。 如果是后者,它必须是这种格式 array(operator, operand1, operand2, ...), 操作符可以是下面当中的一个,可能的操作数依赖于相应的操作符 :
    
    and: 操作数应该使用AND连接起来。例如, array('and', 'id=1', 'id=2') 将生成 'id=1 AND id=2'。如果一个操作数是一个数组, 它将被使用这里描述的相同规则转换成一个字符串。例如, array('and', 'type=1', array('or', 'id=1', 'id=2')) 将生成 'type=1 AND (id=1 OR id=2)'。 该方法将不做任何引用或转义。
    or: 和 and 操作符相似,除了操作数是使用OR连接起来。
    in: 操作数1应该是一列或DB表达式,操作数2应该是一个数组, 表示相应的列的值或DB表达式应该在的范围。例如, array('in', 'id', array(1,2,3)) 将生成 'id IN (1,2,3)'. 这个方法将正确的引用列名和范围中的转义值。
    not in: 和 in 相似,除了在生成条件时把IN替换成NOT IN.
    like: 操作数1应该是一列或一个DB表达式,操作数2是一个字符串或一个数组 表示列或DB表达式应该like的值。 例如, array('like', 'name', '%tester%') 将生成 "name LIKE '%tester%'". 当值范围被给定为一个数组,多个LIKE谓语将被生成并使用AND连接起来。 例如, array('like', 'name', array('%test%', '%sample%')) 将生成 "name LIKE '%test%' AND name LIKE '%sample%'". 这个方法将正确的引用列名和范围中的转义值。
    not like: 和 like相似,除了在生成条件时使用NOT LIKE替换LIKE。
    or like: 和 like相似,除了OR被用作把LIKE谓语连接起来。
    or not like: 和 not like相似,除了OR被用作把NOT LIKE谓语连接起来。
  • 相关阅读:
    DataTable
    asp.net2.0异步页面和异步web部件
    Ref 和Out 区别
    关于String str =new String("abc")和 String str = "abc"的比较
    MongoDB介绍及安装
    通过MongoDB的samus驱动实现基本数据操作
    SQL 联合索引 与 单一列的索引 比较
    C#字符串处理(String与StringBuilder)
    C#操作文件夹及文件的方法的使用
    常见的sql语句 注意点及用法【区分mysql 和Sqlserver】
  • 原文地址:https://www.cnblogs.com/toumingbai/p/4513755.html
Copyright © 2011-2022 走看看