Các bước xây dựng chương trình có kết nối tới CSDL My SQL:
Thông thường, trong một ứng dụng có giao tiếp với CSDL, ta phải làm theo bốn trình tự sau:
Bước 1: Thiết lập kết nối tới CSDL. Bước 2: Lựa chọn CSDL.
Bước 3: Tiến hành các truy vấn SQL, xử lý các kết quả trả về nếu có Bước 4: Đóng kết nối tới CSDL.
Chú ý: Trước khi sử dụng PHP để lập trình với MySQL, hãy sử dụng chương trình
quản lý phpMyAdmin để tạo trước một CSDL, vài bảng cũng như người dùng... để tiện thực hành.
Để làm việc với mysql và PHP chúng ta cần nắm 6 hàm cơ bản: 1- Kết nối cơ sở dữ liệu:
Cú pháp:
mysql_connect("hostname","user","pass")
2- Lựa chọn cơ sở dữ liệu: Cú pháp:
mysql_select_db("tên_CSDL")
47 $conn=mysql_connect("localhost","root","root") or die(" khong the ket noi"); mysql_select_db("demo");
3- Thực thi câu lệnh truy vấn: Cú pháp:
mysql_query("Câu truy vấn ở đây");
4- Đếm số dòng dữ liệu trong bảng: Cú pháp:
mysql_num_rows();
5- Lấy dữ liệu từ bảng đưa vào mảng: Cú pháp:
mysql_fetch_array();
6- Đóng kết nối cơ sở dữ liệu: Cú pháp:
mysql_close();
Ví dụ áp dụng:
Tạo cơ sở dữ liệu demo_mysql, trong đó tạo bảng user với các trường: id, username, password,:
Tạo trang test.php. Đầu tiên chúng ta sẽ kết nối cơ sở dữ liệu. <?
$conn=mysql_connect("localhost", "root", "root") or die("can't connect database"); mysql_select_db("demo_mysql",$conn);
?>
<?
$sql="select * from user"; $query=mysql_query($sql); ?>
Kiểm tra xem trong bảng dữ liệu đã tồn tại user nào chưa ?. Nếu chưa thì xuất ra thông báo lỗi, ngược lại thì đưa chúng vào mảng và lặp cho đến hết bảng dữ liệu.
<?
if(mysql_num_rows($query) == 0) {
echo "Chua co du lieu"; }
else {
while($row=mysql_fetch_array($query)) {
echo $row[username] ." - ".$row[password]."<br />"; }
} ?>
Và cuối cùng chúng ta đóng kết nối và kết thúc thao tác xử lý. <?
mysql_close($conn); ?>
File hoàn chỉnh của ứng dụng trên: <?
$conn=mysql_connect("localhost", "root", "root") or die("can't connect database"); mysql_select_db("demo_mysql",$conn);
$sql="select * from user"; $query=mysql_query($sql);
if(mysql_num_rows($query) == 0) {
echo "Chua co du lieu"; }
49 else
{
while($row=mysql_fetch_array($query)) {
echo $row[username] ." - ".$row[password]."<br />"; }
}
mysql_close($conn); ?>
Viết ứng dụng đăng nhập bằng PHP và MYSQL
Trước hết chúng ta phải sử dụng phpMyAdmin để tạo CSDL như sau: - Tạo cơ sở dữ liệu có tên project
- Tạo bảng user (id (INT), username (VARCHAR(50)), password VARCHAR(50), level CHAR(1))
- Thêm dữ liệu
insert into user(username,password,level) values("admin","12345","2") ("abc","12345","1");
Vậy là chúng ta đã có cơ sở dữ liệu như mô hình trên. Tiếp đến chúng ta tạo file login.php và thiết kế Form HTML để có màn hình đăng nhập khi người dùng truy cập.
1 <form action='login.php' method='post'>
2 Username: <input type='text' name='username' size='25' /><br /> 3 Password: <input type='password' name='password' size='25' /><br /> 4 <input type='submit' name='ok' value='Dang Nhap' />
Tiếp đến chúng ta tiến hành kiểm tra dữ liệu từ form 01 <?php 02 if(isset($_POST['ok'])) 03 { 04 $u=$p=""; 05 if($_POST['username'] == NULL) 06 {
07 echo "Please enter your username<br />"; 08 } 09 else 10 { 11 $u=$_POST['username']; 12 } 13 if($_POST['password'] == NULL) 14 {
15 echo "Please enter your password<br />"; 16 } 17 else 18 { 19 $p=$_POST['password']; 20 } 21 } 22 ?>
Đoạn code ở trên sẽ kiểm tra xem người dùng có tiến hành nhấn nút đăng nhập hay không. Và nếu có thì chúng ta sẽ xét tiếp tình trạng người dùng có để trống các ô username và password hay không. Nếu có chúng ta sẽ thông báo lỗi ở bên trên form, để người sử dụng tiến hành nhập liệu. Vì phiên bản PHP 5.3 trở lên sẽ yêu cầu ta khai báo biến trước khi sử dụng. Vì thế mặc định ban đầu ta khởi tạo 2 biến $u và $p mang giá trị là rỗng.
Kế đến chúng ta kiểm tra xem có tồn tại hai biến $u và $p (chỉ khi người dùng đăng nhập thành công thì mới có thể tạo ra 2 biến đó). Tiếp đến chúng ta tiến hành kết nối cơ sở dữ liệu (xem lại bàikết hợp PHP & MYSQL trong ứng dụng web).
51 1 <?php
2 $conn=mysql_connect("localhost","root","root") or die("can't connect this database");
3 mysql_select_db("project",$conn); 4 ?>
Và tiến hành kiểm tra xem username và password người sử dụng vừa nhập có trùng khớp với thông tin có trong cơ sở dữ liệu hay không ?. Nếu không thì chúng ta sẽ báo lỗi ngay. Ngược lại sẽ tiến hành lấy dữ liệu từ bảng và gán vào session. Để có thể quản lý phiên làm việc một cách hiệu quả trên mọi trang của khu vực admin (xem lại bài khái niệm cơ bản về cookie và session).
01 <?php
02 if($u && $p) 03 {
04 $conn=mysql_connect("localhost","root","root") or die("can't connect this database");
05 mysql_select_db("project",$conn);
06 $sql="select * from user where username='".$u."' and password='".$p."'"; 07 $query=mysql_query($sql);
08 if(mysql_num_rows($query) == 0) 09 {
10 echo "Username or password is not correct, please try again"; 11 } 12 else 13 { 14 $row=mysql_fetch_array($query); 15 session_start(); 16 $_SESSION['userid'] = $row['id']; 17 $_SESSION['level'] = $row['level']; 18 } 19 } 20 ?>
Như vậy code hoàn chỉnh cho ứng dụng (file login.php) này là như sau: 01 <?php 02 if(isset($_POST['ok'])) 03 { 04 $u=$p=""; 05 if($_POST['username'] == NULL) 06 {
07 echo "Please enter your username<br />"; 08 } 09 else 10 { 11 $u=$_POST['username']; 12 } 13 if($_POST['password'] == NULL) 14 {
15 echo "Please enter your password<br />"; 16 } 17 else 18 { 19 $p=$_POST['password']; 20 } 21 if($u && $p) 22 {
23 $conn=mysql_connect("localhost","root","root") or die("can't connect this database");
24 mysql_select_db("project",$conn);
25 $sql="select * from user where username='".$u."' and password='".$p."'"; 26 $query=mysql_query($sql);
27 if(mysql_num_rows($query) == 0) 28 {
29 echo "Username or password is not correct, please try again"; 30 }
53 32 { 33 $row=mysql_fetch_array($query); 34 session_start(); 35 $_SESSION['userid'] = $row[id]; 36 $_SESSION['level'] = $row[level]; 37 38 } 39 } 40 } 41 ?> 42 <form action='login.php' method='post'>
43 Username: <input type='text' name='username' size='25' /><br /> 44 Password: <input type='password' name='password' size='25' /><br /> 45 <input type='submit' name='ok' value='Dang Nhap' />
Các hàm MYSQL trong PHP
1. resource mysql_connect ([string $server [, string $username [, string
$password [, bool $new_link [, int $client_flags]]]]] ) Mô tả : Tạo mới hoặc sử dụng lại một kết nối đến MySQL Server Tham số :
$server - Tên của MySQL Server có dạng protocol://hostname:port
- Có thể sử dụng tham số mysql.default_host mặc định có giá trị là localhost:3306
$username - username của MySQL Server $password - password của MySQL Server
$new_link - sử dụng 1 link đã tạo trước đó bằng mysql_connect để dùng cho link này
$client_flag - một số cờ điều chỉnh : MYSQL_CLIENT_SSL,
MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORESPACE, MYSQL_CLIENT_INTERACTIVE
Giá trị trả về : trả về 1 liên kết hoặc FALSE nếu thất bại
Ví dụ : tạo 1 link đến localhost, có username=mysql_user và
password=mysql_password. Sau đó kiểm tra nếu thành công thì báo ‘Connected successfully’, nếu không thì ‘Could not connect’
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) {
die('Could not connect: ' . mysql_error()); }
echo 'Connected successfully';
mysql_close($link);
?>
Sử dụng hostname:port và sử dụng ipaddress:port
<?php
// we connect to example.com and port 3307
$link = mysql_connect('example.com:3307', 'mysql_user', 'mysql_password'); if (!$link) {
die('Could not connect: ' . mysql_error()); }
echo 'Connected successfully';
mysql_close($link);
// we connect to localhost at port 3307
$link = mysql_connect('127.0.0.1:3307', 'mysql_user', 'mysql_password'); if (!$link) {
die('Could not connect: ' . mysql_error()); }
echo 'Connected successfully';
mysql_close($link);
55 Chú ý:
• Nên sử dụng “127.0.0.1” thay vì “localhost”
• biến link sẽ tự động close sau khi kết thúc đoạn mã
2. resource mysql_pconnect ([ string $server [, string $username [, string
$password [, int $client_flags ]]]] )
Mô tả : giống như mysql_connect nhưng mysql_pconnect có thêm 1 số tính năng :
• Nếu đã có 1 link trước đó kết nối đến cùng 1 MySQL Server bằng mysql_pconnect thì hàm sẽ tìm và trả về link này
• Nếu chưa có, hàm sẽ thiết lập 1 kết nối giống như mysql_connect, kết nối này vẫn tồn tại sau khi kết thúc đoạn mã
Tham số :
$server - Tên của MySQL Server có dạng protocol://hostname:port
- Có thể sử dụng tham số mysql.default_host mặc định có giá trị là localhost:3306
$username - username của MySQL Server $password - password của MySQL Server
$client_flag - một số cờ điều chỉnh : MYSQL_CLIENT_SSL,
MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORESPACE, MYSQL_CLIENT_INTERACTIVE
Giá trị trả về : biến link đến MySQLServer nếu thành công và FALSE nếu thất bại Lưu ý :
• link đến CSDL sẽ không close khi kết thúc mã
• Phải cẩn thận không để vượt quá số connection được phép đến MySQL Server
3. bool mysql_create_db($database_name[, resource $link_identifier]) Tạo 1 database mới trên server kết hợp với tên của connection thông qua $link_identifier
Tham số:
$database_name tên của database sẽ được tạo
$link_identifier biến $link được tạo bằng 2 phương pháp trên Giá trị trả về : TRUE hoặc FALSE
Ví dụ : Tạo 1 kết nối đến MySQL Server trả về biến $link, sau đó tạo CSDL ‘database_name’
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) {
die('Could not connect: ' . mysql_error()); }
$db_name = 'database_name;
if (mysql_create_db($db_name, $link)) {
echo "Database my_db created successfully\n"; } else {
echo 'Error creating database: ' . mysql_error() . "\n"; }
?>
Lưu ý :
• Hàm này có thể thay bằng mysql_query(string $query, resource $link)
• Để tương thích ngược có thể sử dụng mysql_createdb()
4. bool mysql_select_db ( string $database_name [, resource $link_identifier ] ) Mô tả : chọn một cơ sở dữ liệu để làm việc. Một $link phải được mở trước đó
Tham số :
$database_name tên cơ sở dữ liệu cần chọn
$link_identifier $link tham chiếu đến MySQL Server Giá trị trả về :
TRUE hoặc FALSE
Ví dụ : tạo 1 link đến localhost, sau đó thử select database tên ‘foo’ và in ra kết quả
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) {
die('Not connected : ' . mysql_error()); }
// make foo the current db
$db_selected = mysql_select_db('foo', $link); if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error()); }
?>
Lưu ý :
• Để tương thích ngược, có thể sử dụng mysql_selectdb()
5. resource mysql_query ( string $query [, resource $link_identifier ] )
Mô tả : thực thi 1 câu query trên CSDL được chọn Tham số :
57 $query Câu lệnh query, không kết thúc bằng dấu ;
$link_identifier $link kết nối đến MySQL Server Giá trị trả về :
• Nếu câu SQL thuộc dạng SELECT hoặc các loại trả về resultset, mysql_query() trả về 1 resource khi thành công và FALSE khi thất bại
• Nếu câu SQL thuộc dạng ALTER, INSERT, UPDATE, DELETE, DROP, mysql_query() trả về TRUE nếu thành công và FALSE nếu thất bại
Ví dụ : truy vấn 1 CSDL
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) {
die('Not connected : ' . mysql_error()); }
// make foo the current db
$db_selected = mysql_select_db('foo', $link); if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error()); }
else {
$result = mysql_query('select * from sometable', $link); if(!$result) {
die('Error querying : ' . mysql_error()); }
}
?>
Lưu ý :
• Nếu kết quả trả về là 1 resource, ta đưa resource này vào mysql_fetch_array() để có thể duyệt qua kết quả
• Nếu kết quả trả về là 1 result set, ta dùng mysql_num_rows() để xem bao nhiêu dòng được truy vấn
• Nếu kết quả trả về là kết quả của các câu query dạng ALTER, INSERT, UPDATE, DELETE, DROP thì ta dùng mysql_affected_row() để xem có bao nhiêu dòng bị ảnh hưởng
• mysql_query() sẽ trả về FALSE trong các trường hợp vi phạm permission
6. array mysql_fetch_array ( resource $result [, int $result_type ] ) Mô tả : Trả về một mảng tương ứng với các hàng đã lấy được
$result kết quả trả về từ mysql_query()
$rsult_type cho ta xác định mảng trả về cho phép truy cập index bằng chỉ số hay tên cột
• MYSQL_ASSOC : truy cập bằng tên cột
• MYSQL_NUM : truy cập bằng chỉ số
• MYSQL_BOTH : dùng cả 2 Giá trị trả về :
Trả về 1 array hoặc FALSE nếu thất bại Sử dụng mysql_fetch_array vói MYSQL_NUM
<?php
mysql_connect("localhost", "mysql_user", "mysql_password") or die("Could not connect: " . mysql_error());
mysql_select_db("mydb");
$result = mysql_query("SELECT id, name FROM mytable"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { printf("ID: %s Name: %s", $row[0], $row[1]);
}
mysql_free_result($result);
?>
Sử dụng mysql_fetch_array với MYSQL_ASSOC
<?php
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { printf("ID: %s Name: %s", $row["id"], $row["name"]); }
?>
Sử dụng mysql_fetch_array với MYSQL_BOTH
<?php
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) { printf ("ID: %s Name: %s", $row[0], $row["name"]); }
?>
Lưu ý :
• Dùng mysql_fetch_array() chậm hơn nhiều so với mysql_fetch_row()
59 7. array mysql_fetch_row ( resource $result )
Mô tả : giống như mysql_fetch_array() với tham số MYSQL_NUM Tham số :
$result kết quả trả về từ mysql_query() Giá trị trả về : Array hoặc FALSE
Ví dụ
<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'"); if (!$result) {
echo 'Could not run query: ' . mysql_error(); exit;
}
$row = mysql_fetch_row($result); echo $row[0]; // 42
echo $row[1]; // the email value
?>
8. array mysql_fetch_assoc ( resource $result )
Mô tả: giống như mysql_fetch_array() với tham số MYSQL_ASSOC Tham số :
$result kết quả trả về từ mysql_query() Giá trị trả về : Array hoặc FALSE
Ví dụ
<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'"); if (!$result) {
echo 'Could not run query: ' . mysql_error(); exit;
}
$row = mysql_fetch_row($result); echo $row['id']; // 42
echo $row['email']; // the email value
9. int mysql_num_rows ( resource $result )
Mô tả : Trả về số dòng trong resultset sau khi sử dụng mysql_query() Tham số :
$result kết quả trả về của mysql_query()
Giá trị trả về : Số dòng INT hoặc FALSE nếu thất bại Ví dụ
<?php
$link = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("database", $link);
$result = mysql_query("SELECT * FROM table1", $link);
$num_rows = mysql_num_rows($result); echo "$num_rows Rows\n";
?>
10.int mysql_affected_rows ([ resource $link_identifier ] )
Mô tả : Trả về số dòng bị ảnh hưởng của lần ALTER, INSERT, UPDATE, DELETE, DROP gần nhất
Tham số :
$link_identifier $link kết nối đến MySQL Server
Giá trị trả về : Số dòng bị ảnh hưởng INT hoặc FALSE nếu thất bại Ví dụ
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) {
die('Could not connect: ' . mysql_error()); }
mysql_select_db('mydb');
/* this should return the correct numbers of deleted records */
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Records deleted: %d\n", mysql_affected_rows()); /* with a where clause that is never true, it should return 0 */
mysql_query('DELETE FROM mytable WHERE 0');
printf("Records deleted: %d\n", mysql_affected_rows());
61 11.int mysql_num_fields ( resource $result )
Mô tả: Trả về số lượng cột trong 1 câu query Tham số :
$result kết quả trả về của mysql_query()
Giá trị trả về : Số lượng cột trong câu query hoặc FALSE nếu thất bại Ví dụ
<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'"); if (!$result) {
echo 'Could not run query: ' . mysql_error(); exit;
}
/* returns 2 because id,email === two fields */ echo mysql_num_fields($result);
?>
12. object mysql_fetch_field ( resource $result [, int $field_offset ] ) Mô tả : Lấy thông tin của 1 cột tại index $field_offset
Tham số :
$result kết quả trả về từ mysql_query()
$field_offset cột cần lấy thông tin. Nếu không chỉ định, mỗi lần mysql_fetch_field() sẽ lấy cột theo thứ tự từ 0->tổng số field
Giá trị trả về :
Trả về 1 object chứa các thông tin sau :
• name : tên cột
• table : tên bảng chưa cột
• max_length : chiều dài tối đa của cột
• not_null : bằng 1 nếu cột không cho phép null
• primary_key : bằng 1 nếu cột là khóa chính
• unique_key : bằng 1 nếu cột là unique
• multiple_key : bằng 1 nếu cột không phải là unique
• numeric : bằng 1 nếu cột có kiểu dữ liệu là số
• blob : bằng 1 nếu cột có kiểu dữ liệu là blob
• unsigned : bằng 1 nếu cột là cột số và không cho phép âm
• zerofill : bằng 1 nếu cột có tính năng tự điền 0 cho đủ chiều dài Ví dụ : tìm thông tin cột
<?php
$conn = mysql_connect('localhost', 'mysql_user', 'mysql_password');
mysql_select_db('database');
$result = mysql_query('select * from table'); /* get column metadata */
$i = 0;
while ($i < mysql_num_fields($result)) { echo "Information for column $i:<br />\n"; $meta = mysql_fetch_field($result, $i); if (!$meta) {
echo "No information available<br />\n"; }
echo "<pre>
blob: $meta->blob
max_length: $meta->max_length
multiple_key: $meta->multiple_key
name: $meta->name
not_null: $meta->not_null
numeric: $meta->numeric
primary_key: $meta->primary_key
table: $meta->table
type: $meta->type
unique_key: $meta->unique_key
unsigned: $meta->unsigned
zerofill: $meta->zerofill
</pre>"; $i++; }
mysql_free_result($result);
?>
13.resource mysql_list_dbs ([ resource $link_identifier ] )
Mô tả: Liệt kê tất cả các database có trong $link_identifier Tham số :
$link_identifier $link kết nối đến MySQL Server
Giá trị trả về : Trả về 1 resource, dùng mysql_fetch_array() để duyệt Ví dụ : tìm tất cả database hiện có
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db_list = mysql_list_dbs($link);
while ($row = mysql_fetch_object($db_list)) { echo $row->Database . "\n";
63 }
?>
14.bool mysql_close ([ resource $link_identifier ] ) Mô tả : đóng kết nối CSDL
Tham số :
$link_identifier $link kết nối đến MySQL Server
Giá trị trả về : TRUE nếu thành công hoặc FALSE nếu thất bại
Ví dụ :
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) {
die('Could not connect: ' . mysql_error()); }
echo 'Connected successfully';
mysql_close($link);
?>
Lưu ý : mysql_close() sẽ không đóng kết nối CSDL được tạo bởi mysql_pconnect() 15.bool mysql_free_result ( resource $result )
Mô tả: giải phóng bộ nhớ dùng bởi result. Thường dùng khi ta đã mysql_fetch_array() xong và không cần dùng đến $result nữa
Tham số :
$result kết quả trả về từ mysql_query()
Giá trị trả về : TRUE nếu thành công hoặc FALSE nếu thất bại Ví dụ
<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'"); if (!$result) {
echo 'Could not run query: ' . mysql_error(); exit;
}
/* Use the result, assuming we're done with it afterwards */
$row = mysql_fetch_assoc($result);
/* Now we free up the result and continue on with our script */
mysql_free_result($result); ?>
16.int mysql_insert_id ([ resource $link_identifier ] )
Tham số :
$link_identifier $link tới kết nối MySQL Server Giá trị trả về :
• ID của cột có thuộc tính AUTO_INCREMENT của lần INSERT thành công gần nhất
• 0 nếu lần INSERT rồi không có cột nào có thuộc tính AUTO_INCREMENT
• FALSE nếu có lỗi xảy ra Ví dụ
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) {
die('Could not connect: ' . mysql_error()); }
mysql_select_db('mydb');
mysql_query("INSERT INTO mytable (product) values ('kossu')");
printf("Last inserted record has id %d\n", mysql_insert_id());
?>
Lưu ý:
• mysql_insert_id trả về INTEGER 32 bit trong PHP, nếu cột có kiểu là BigInt 64 thì kết