本文目錄一覽:
- 1、Yii2框架操作數據庫的方法分析【以mysql為例】
- 2、關於php操作mysql執行數據庫查詢的一些常用操作匯總
- 3、關於mysql數據庫操作
- 4、MySQL數據庫設置遠程訪問權限方法小結
- 5、深入理解MySQL數據庫各種鎖(總結)
- 6、MySQL數據庫的索引的操作知多少
Yii2框架操作數據庫的方法分析【以mysql為例】
本文實例講述了Yii2框架操作數據庫的方法。分享給大家供大家參考,具體如下:
準備數據庫
DROP
TABLE
IF
EXISTS
`pre_user`;
CREATE
TABLE
`pre_user`(
`id`
int(11)
AUTO_INCREMENT
PRIMARY
KEY,
`username`
varchar(255)
NOT
NULL,
`password`
varchar(32)
NOT
NULL
DEFAULT
”,
`password_hash`
varchar(255)
NOT
NULL
DEFAULT
”,
`email`
varchar(255)
NOT
NULL
DEFAULT
”,
`status`
smallint(6)
NOT
NULL
DEFAULT
10,
`created_at`
smallint(6)
NOT
NULL
DEFAULT
0,
`updated_at`
smallint(6)
NOT
NULL
DEFAULT
)ENGINE=InnoDB
DEFAULT
CHARSET=utf8mb4;
配置連接
config\db.php
?php
return
[
‘class’
=
‘yii\db\Connection’,
‘dsn’
=
‘mysql:host=localhost;dbname=yii2’,
‘username’
=
‘root’,
‘password’
=
‘root’,
‘charset’
=
‘utf8mb4’,
‘tablePrefix’
=
‘pre_’
];
查看數據庫連接是否成功
控制器里打印:
var_dump(\Yii::$app-db);
怎麼執行SQL語句?
增刪改
//
接收表單的數據
$username
=
‘jack’;
$sql
=
“INSERT
INTO
{{%user}}
(username,status)
VALUES
(:username,:status)”;
//
返回受影響行數
$row
=
\Yii::$app-db-createCommand($sql,[‘username’=$username,’status’=8])-execute();
//
獲取自增ID
echo
\Yii::$app-db-getLastInsertID();
查詢
$sql
=
“SELECT
*
FROM
{{%user}}
WHERE
id:id”;
//
查詢結果是一個二維數組
$userArr
=
\Yii::$app-db-createCommand($sql,[‘id’=1])-queryAll();
//
如果要查詢一個
$user
=
\Yii::$app-db-createCommand($sql,[‘id’=1])-queryOne();
//
如果要返回單值
//
例如
select
count(*)語句
$count
=
\Yii::$app-db-createCommand($sql,[‘id’=1])-queryScalar();
echo
$count;
更多關於Yii相關內容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php面向對象程序設計入門教程》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
希望本文所述對大家基於Yii框架的PHP程序設計有所幫助。
您可能感興趣的文章:Yii2.0高級框架數據庫增刪改查的一些操作Yii2——使用數據庫操作匯總(增刪查改、事務)Yii2數據庫操作常用方法小結Yii2框架實現數據庫常用操作總結Yii2實現跨mysql數據庫關聯查詢排序功能代碼Yii+MYSQL鎖表防止並發情況下重複數據的方法Yii
連接、修改
MySQL
數據庫及phpunit
測試連接Yii實現MySQL多數據庫和讀寫分離實例分析Yii操作數據庫實現動態獲取表名的方法Yii操作數據庫的3種方法
關於php操作mysql執行數據庫查詢的一些常用操作匯總
php操作mysql步驟:
1.$connect=mysql_connect(‘localhost’,’root’,’123456′)
or
die(‘數據庫連接失敗。’mysql_error());鏈接mysql。
2.mysql_select_db(‘database’,$connect)選擇鏈接的數據庫。
3.mysql_query(‘Set
names
gb2312′);$sql
=
“select
*
from
blog_article”;準備要查詢的數據。
4.$datas
=
mysql_query($sql);執行sql查詢。
5.$data
=
mysql_fetch_assoc($datas)得到查詢到的緩存在內存中的一條數據。
6.print_r($data);
相同點:三個函數都是返回數據庫中查詢到的一行數據(說的再清楚點就是一條數據)。
不同點:mysql_fetch_assoc()用的是數據庫中相應的字段名作為的key值(也就是數組下標)
如:filed[‘id’]=1;
mysql_fetch_row()用的是自動生成的數字(從0開始依次生成)作為的key值(也就是數組下標)
如:filed[0]=1;
mysql_fetch_array()用的是自動生成的數字(從0開始依次生成)作為的key值(也就是數組下標),而且它還同時生成數據庫中相應的字段名作為的key值(也就是數組下標)
如:
filed[0]=1,filed[‘id’]=1;也就是說,mysql_fetch_array()將mysql_fetch_assoc()和mysql_fetch_row()查詢到的結果合為了一體了。
mysql_fetch_object()與mysql_fetch_assoc()差不多。只是mysql_fetch_assoc()返回的是數組。mysql_fetch_object()返回的是object對象。
mysql_insert_id() 取得上一步
INSERT
操作產生的
ID。
mysql_result()
函數返回結果集中一個字段的值。
mysql_num_fields()
函數返回結果集中字段的數目。
mysql_affected_rows();返回前一次
MySQL
操作所影響的記錄行數。
mysql_num_rows(mysql_query($sql))獲得結果集中行的數目。
mysql_pconnect()
函數打開一個到
MySQL
服務器的持久連接。
mysql_pconnect()
和
mysql_connect()
非常相似,但有兩個主要區別:
1.
當連接的時候本函數將先嘗試尋找一個在同一個主機上用同樣的用戶名和密碼已經打開的(持久)連接,如果找到,則返回此連接標識而不打開新連接。
2.
其次,當腳本執行完畢後到
SQL
服務器的連接不會被關閉,此連接將保持打開以備以後使用(mysql_close()
不會關閉由
mysql_pconnect()
建立的連接)。
mysql_data_seek(mysql_query($sql),8);獲得結果集中的第8條數據。(mysql_num_rows(mysql_query($sql))和mysql_data_seek(mysql_query($sql),8)在mysql_unbuffered_query($sql)不可以使用。)
mysql_unbuffered_query($sql)和mysql_query($sql)效果差不多,但是
mysql_unbuffered_query($sql)不緩存。mysql_query($sql)會緩存查詢的結果。
mysql_close();關閉mysql的最近的鏈接。
mysql_field_flags(mysql_query($sql),6)返回第六個字段的表屬性輸出如:not_null
primary_key
auto_increment
。
mysql_fetch_lengths(mysql_query($sql))返回該條數據的所有字段的每個字段的長度。返回的是一個數字組成的數組。
mysql_field_name(mysql_query($sql),3)返回第三個字段的字段名。
mysql_field_table(mysql_query($sql),0)返回指定字段所在的表名。
mysql_free_result(mysql_query($sql))
函數釋放結果內存。
mysql_get_client_info()
函數返回
MySQL
客戶端信息。
mysql_get_host_info()
取得
MySQL
主機信息。
關於mysql數據庫操作
1.
create
database
school;//創建數據庫
2.
show
databases;
//查看數據庫
3.
use
school;
//使用創建的數據庫
4.
create
table
students
(
s_no
int
,name
varchar(20),gender
varchar(10),birthday
datetime,image
blob
,address
varchar(50),
c_no
int,primary
key
(s_no,c_no)
);
//建students表
5.
create
table
classes(c_no
int,name
varchar(20)
,
class_adviser
varchar(20)
,foreign
key(c_no)
REFERENCES
students(c_no));
//建classes表
6.
insert
into
students(s_no,name,gender,birthday,image,address,c_no)
values(1,’Sally’,’FM’,’1987-1-2′,null,’aaaaa’,1);
7.
insert
into
students(s_no,name,gender,birthday,image,address,c_no)
values(2,’Nicholas’,’M’,’1985-8-8′,Null,’bbbbb’,1);
8.
insert
into
students(s_no,name,gender,birthday,image,address,c_no)
values(3,’Jason’,’M’,’1988-5-19′,Null,’ccccc’,2);
9.
insert
into
students(s_no,name,gender,birthday,image,address,c_no)
values(4,’Jamile’,’M’,’1979-2-5′,Null,’ddddd’,2);
10.
insert
into
classes
(c_no,name,class_adviser)
values
(1,’Class1′,’Mike’);
11.
insert
into
classes
(c_no,name,class_adviser)
values
(2,’Class2′,’Andy’);
12.
select
a.*
from
students
a,
classes
b
where
a.c_no
in
(select
b.c_no
from
classes
b
where
b.class_adviser
=
‘Mike’)
and
a.c_no
=
b.c_no;
//查數據
或者
select
students.s_no,
students.name,
students.gender,
students.birthday,
students.image,
students.address,
students.c_no
from
students,
classes
where
students.c_no
in
(select
c_no
from
classes
where
class_adviser
=
‘Mike’)
and
students.c_no
=
classes.c_no;
盧旭
MySQL數據庫設置遠程訪問權限方法小結
MySQL基礎知識第一期,如何遠程訪問MySQL數據庫設置權限方法總結,討論訪問單個數據庫,全部數據庫,指定用戶訪問,設置訪問密碼,指定訪問主機。
1,設置訪問單個數據庫權限
複製代碼
代碼如下:
mysqlgrant
all
privileges
on
test.*
to
‘root’@’%’;
說明:設置用戶名為root,密碼為空,可訪問數據庫test
2,設置訪問全部數據庫權限
複製代碼
代碼如下:
mysqlgrant
all
privileges
on
*.*
to
‘root’@’%’;
說明:設置用戶名為root,密碼為空,可訪問所有數據庫*
3,設置指定用戶名訪問權限
複製代碼
代碼如下:
mysqlgrant
all
privileges
on
*.*
to
‘liuhui’@’%’;
說明:設置指定用戶名為liuhui,密碼為空,可訪問所有數據庫*
4,設置密碼訪問權限
複製代碼
代碼如下:
mysqlgrant
all
privileges
on
*.*
to
‘liuhui’@’%’
IDENTIFIED
BY
‘liuhui’;
說明:設置指定用戶名為liuhui,密碼為liuhui,可訪問所有數據庫*
5,設置指定可訪問主機權限
複製代碼
代碼如下:
mysqlgrant
all
privileges
on
*.*
to
‘liuhui’@’10.2.1.11’;
說明:設置指定用戶名為liuhui,可訪問所有數據庫*,只有10.2.1.11這台機器有權限訪問
還可以設置指定訪問某個數據庫下的某個數據表,請繼續關注MySQL基礎知識系列。
深入理解MySQL數據庫各種鎖(總結)
MyISAM和InnoDB存儲引擎使用的鎖:
封鎖粒度小:
由於InnoDB存儲引擎支持的是行級別的鎖,因此意向鎖(因為意向鎖是表鎖)其實不會阻塞除全表掃以外的任何請求。故表級意向鎖與行級鎖的兼容性如下所示
參考
參考
行鎖的三種算法:
這條語句阻止其他事務插入10和20之間的數字,無論這個數字是否存在。 間隙可以跨越0個,單個或多個索引值。
共享鎖:
排他鎖:
樂觀鎖:總是假設最好的情況,每次去拿數據的時候都認為別人不會修改(天真), 操作數據時不會上鎖 ,但是 更新時會判斷在此期間有沒有別的事務更新這個數據,若被更新過,則失敗重試 ;適用於讀多寫少的場景。
樂觀鎖的實現方式 有:
關閉自動提交後,我們需要手動開啟事務。
上述就實現了悲觀鎖,悲觀鎖就是悲觀主義者,它會認為我們在事務A中操作數據1的時候,一定會有事務B來修改數據1,所以,在第2步我們將數據查詢出來後直接加上排它鎖(X)鎖,防止別的事務來修改事務1,直到我們commit後,才釋放了排它鎖。
MySQL數據庫的索引的操作知多少
MySQL索引類型包括:
(1)普通索引
這是最基本的索引,它沒有任何限制。它有以下幾種創建方式:
◆創建索引
CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR類型,length可以小於字段實際長度;如果是BLOB和TEXT類型,必須指定 length,下同。
◆修改表結構
ALTER mytable ADD INDEX [indexName] ON (username(length))
◆創建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); 刪除索引的語法:
DROP INDEX [indexName] ON mytable;
(2)唯一索引
與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式:
◆創建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
◆修改表結構
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
◆創建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
(3)主鍵索引
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創建主鍵索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) ); 當然也可以用 ALTER 命令。記住:一個表只能有一個主鍵。
(4)組合索引
為了形象地對比單列索引和組合索引,為表添加多個字段:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL ); 為了進一步榨取MySQL的效率,就要考慮建立組合索引。就是將 name, city, age建到一個索引里:
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age); 建表時,usernname長度為 16,這裡用 10。這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引文件的大小,提高INSERT的更新速度。
如果分別在 usernname,city,age上建立單列索引,讓該表有3個單列索引,查詢時和上述的組合索引效率也會大不一樣,遠遠低於我們的組合索引。雖然此時有了三個索引,但MySQL只能用到其中的那個它認為似乎是最有效率的單列索引。
建立這樣的組合索引,其實是相當於分別建立了下面三組組合索引:
usernname,city,age usernname,city usernname 為什麼沒有 city,age這樣的組合索引呢?這是因為MySQL組合索引“最左前綴”的結果。簡單的理解就是只從最左面的開始組合。並不是只要包含這三列的查詢都會用到該組合索引,下面的幾個SQL就會用到這個組合索引:
SELECT * FROM mytable WHREE username=”admin” AND city=”鄭州” SELECT * FROM mytable WHREE username=”admin” 而下面幾個則不會用到:
SELECT * FROM mytable WHREE age=20 AND city=”鄭州” SELECT * FROM mytable WHREE city=”鄭州”
(5)建立索引的時機
一般來說,在WHERE和JOIN中出現的列需要建立索引,但也不完全如此,因為MySQL只對,=,=,,=,BETWEEN,IN,以及某些時候的LIKE才會使用索引。例如:
SELECT t.Name FROM mytable t LEFT JOIN mytable m ON t.Name=m.username WHERE m.age=20 AND m.city=’鄭州’ 此時就需要對city和age建立索引,由於mytable表的userame也出現在了JOIN子句中,也有對它建立索引的必要。
剛才提到只有某些時候的LIKE才需建立索引。因為在以通配符%和_開頭作查詢時,MySQL不會使用索引。例如下句會使用索引:
SELECT * FROM mytable WHERE username like’admin%’ 而下句就不會使用:
SELECT * FROM mytable WHEREt Name like’%admin’ 因此,在使用LIKE時應注意以上的區別。
(6)索引的不足之處
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:
◆雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。
◆建立索引會佔用磁盤空間的索引文件。一般情況這個問題不太嚴重,但如果你在一個大表上創建了多種組合索引,索引文件的會膨脹很快。
索引只是提高效率的一個因素,如果你的MySQL有大數據量的表,就需要花時間研究建立最優秀的索引,或優化查詢語句。
(7)使用索引的注意事項
使用索引時,有以下一些技巧和注意事項:
◆索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在數據庫設計時不要讓字段的默認值為NULL。
◆使用短索引
對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。
◆索引列排序
MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此數據庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列創建複合索引。
◆like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。
◆不要在列上進行運算
select * from users where YEAR(adddate)2007; 將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成
select * from users where adddate‘2007-01-01’;
◆不使用NOT IN和操作
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/295209.html