mysql_nv4
Khác biệt
Đây là những khác biệt giữa hai phiên bản của trang.
Phiên bản trước của cả hai bênPhiên bản trướcPhiên bản sau | Phiên bản trước | ||
mysql_nv4 [2014/11/26 18:12] – [3. Delete] webvang.vn | mysql_nv4 [2021/04/21 11:28] (hiện tại) – [CSDL có chứa kiểu float để giá trị không bị biến đổi] hoaquynhtim99 | ||
---|---|---|---|
Dòng 6: | Dòng 6: | ||
<code php > | <code php > | ||
- | try | + | try { |
- | { | + | $db-> |
- | | + | } catch (PDOException $e) { |
- | } | + | trigger_error(print_r($e, true)); |
- | catch( PDOException $e ) | + | |
- | { | + | |
- | | + | |
} | } | ||
</ | </ | ||
Dòng 19: | Dòng 16: | ||
Có hai cách căn bản để lấy dữ liệu trong PDO là query và excute. | Có hai cách căn bản để lấy dữ liệu trong PDO là query và excute. | ||
+ | |||
- Query: sử dụng trong các trường hợp câu truy vấn không có biến truyền vào, hoặc các biến chắc chắn không gây ra Sql Injection | - Query: sử dụng trong các trường hợp câu truy vấn không có biến truyền vào, hoặc các biến chắc chắn không gây ra Sql Injection | ||
<code php > | <code php > | ||
- | $result = $db-> | + | $result = $db-> |
- | $rs1 = $db-> | + | $rs1 = $db-> |
- | $all_page = $rs1-> | + | $all_page = $rs1-> |
print(" | print(" | ||
- | foreach( $result as $row )// lặp qua từng dòng | + | foreach ($result as $row) { |
- | { | + | |
- | printf( ' | + | printf(' |
} | } | ||
- | |||
</ | </ | ||
- | |||
- Exec: sử dụng trong các trường hợp câu truy vấn không có biến truyền vào, hoặc các biến chắc chắn không gây ra Sql Injection, giá trị trả về là số dòng thực hiện. | - Exec: sử dụng trong các trường hợp câu truy vấn không có biến truyền vào, hoặc các biến chắc chắn không gây ra Sql Injection, giá trị trả về là số dòng thực hiện. | ||
- | $count = $db-> | + | |
+ | <code php> | ||
+ | $count = $db-> | ||
print(" | print(" | ||
- | Ngoài ra, còn có một cách tiếp cận khác nữa là sử dụng bindParam, phương thức này sử dụng trong trường hợp nếu có biến truyền vào câu truy vấn. | + | </ |
+ | |||
+ | Ngoài ra, còn có một cách tiếp cận khác nữa là sử dụng | ||
<code php > | <code php > | ||
$config_name = ' | $config_name = ' | ||
- | $del = $db-> | + | $del = $db-> |
- | $del-> | + | $del-> |
- | $del-> | + | $del-> |
</ | </ | ||
Dòng 50: | Dòng 49: | ||
<code php > | <code php > | ||
$module = ' | $module = ' | ||
- | $sth = $db-> | + | $sth = $db-> |
- | $sth-> | + | $sth-> |
- | $sth-> | + | $sth-> |
$array = $sth-> | $array = $sth-> | ||
- | var_export( $array ); | + | var_export($array); |
</ | </ | ||
Dòng 60: | Dòng 59: | ||
Cũng như cách dùng của API mysql, dữ liệu khi được lấy ra từ cơ sở dữ liệu cần phải được “đổ” (fetch) vào một array, object hoặc một class thì mới sử dụng được. PDO cũng cung cấp một số kiểu fetch cơ bản như sau: | Cũng như cách dùng của API mysql, dữ liệu khi được lấy ra từ cơ sở dữ liệu cần phải được “đổ” (fetch) vào một array, object hoặc một class thì mới sử dụng được. PDO cũng cung cấp một số kiểu fetch cơ bản như sau: | ||
- | - PDO:: | + | |
- | - PDO:: | + | * '' |
- | - PDO:: | + | * '' |
- | - PDO:: | + | * '' |
- | - PDO:: | + | * '' |
- | - PDO:: | + | * '' |
- | Mặc định, NukeViet sử dụng PDO:: | + | * '' |
+ | |||
+ | Mặc định, NukeViet sử dụng | ||
+ | |||
+ | <code php> | ||
$sql = ' | $sql = ' | ||
- | $row = $db-> | + | $row = $db-> |
- | Mặc định, NukeViet sử dụng PDO:: | + | </ |
===== IV. Thao tác dữ liệu ===== | ===== IV. Thao tác dữ liệu ===== | ||
Dòng 107: | Dòng 110: | ||
<code php > | <code php > | ||
- | |||
$stmt = $db-> | $stmt = $db-> | ||
$stmt-> | $stmt-> | ||
Dòng 117: | Dòng 119: | ||
$name = ' | $name = ' | ||
$stmt-> | $stmt-> | ||
- | |||
// Max Weight | // Max Weight | ||
$_sql = ' | $_sql = ' | ||
- | $weight = $db-> | + | $weight = $db-> |
- | $weight = intval( $weight ) + 1; | + | $weight = intval($weight) + 1; |
// Fetch Limit | // Fetch Limit | ||
$db-> | $db-> | ||
- | | + | |
- | ->from( NV_PREFIXLANG . ' | + | -> |
- | ->where( ' | + | -> |
- | $all_page = $db-> | + | $all_page = $db-> |
- | $db-> | + | |
- | ->order( 'id DESC' ) | + | $db-> |
- | ->limit( $per_page ) | + | -> |
- | -> | + | -> |
- | while( $row = $_query-> | + | -> |
- | { | + | while ($row = $_query-> |
- | //$id = $row[' | + | // $id = $row[' |
} | } | ||
- | |||
</ | </ | ||
===== V. Các chú ý trong lập trình CSDL với NukeViet ===== | ===== V. Các chú ý trong lập trình CSDL với NukeViet ===== | ||
- | 1. Về đặt tên các bảng và cột | + | ==== 1. Đặt tên các bảng và cột ==== |
- | - Tên bảng, tên cột chỉ dùng từ từ 2 đến 30 ký tự, chỉ dùng các ký tự a-z, 0-9 và dấu gạch dưới | + | |
- | - Tất cả các dữ liệu các cột cần viết thường, (Nếu có viết hoa thì kết quả trả về trong các mảng khi Fetch dữ liệu cũng là các mảng có chỉ số viết thường) | + | * Tên bảng, tên cột chỉ dùng từ từ 2 đến 30 ký tự, chỉ dùng các ký tự a-z, 0-9 và dấu gạch dưới |
- | 2. Về các câu truy vấn các cột | + | |
+ | |||
+ | ==== 2. Về các câu truy vấn các cột ==== | ||
Thường chúng ta viết câu truy vấn chúng ta viết như sau | Thường chúng ta viết câu truy vấn chúng ta viết như sau | ||
- | MÃ: CHỌN TẤT CẢ | + | |
+ | <code php > | ||
SELECT `catid`, `parentid`, `title` FROM `nv3_vi_news_cat` | SELECT `catid`, `parentid`, `title` FROM `nv3_vi_news_cat` | ||
+ | </ | ||
Thì cần viết lại: | Thì cần viết lại: | ||
- | MÃ: CHỌN TẤT CẢ | + | |
+ | <code php > | ||
SELECT catid, parentid, title FROM nv3_vi_news_cat | SELECT catid, parentid, title FROM nv3_vi_news_cat | ||
+ | |||
+ | </ | ||
Tức bỏ dấu ` đi để có thể chạy được trên các loại CSDL khác, Khi đó sẽ không dùng được các tên sau trong bảng và cột của CSDL: | Tức bỏ dấu ` đi để có thể chạy được trên các loại CSDL khác, Khi đó sẽ không dùng được các tên sau trong bảng và cột của CSDL: | ||
add, all, alter, analyze, and, as, asc, before, between, bigint, binary, both, by, call, cascade, case, change, char, character, check, collate, column, comment, condition, constraint, continue, convert, create, cross, current_user, | add, all, alter, analyze, and, as, asc, before, between, bigint, binary, both, by, call, cascade, case, change, char, character, check, collate, column, comment, condition, constraint, continue, convert, create, cross, current_user, | ||
- | 3. Đặt bí danh cho bảng (Table Allias) | + | |
+ | ==== 3. Đặt bí danh cho bảng (Table Allias) | ||
+ | |||
Không dùng mệnh đề AS cho bảng (Vẫn có thể dùng Allias cho cột được) | Không dùng mệnh đề AS cho bảng (Vẫn có thể dùng Allias cho cột được) | ||
Thay vì viết | Thay vì viết | ||
- | MÃ: CHỌN TẤT CẢ | + | <code php > |
SELECT t1.catid, t1.parentid, | SELECT t1.catid, t1.parentid, | ||
+ | |||
+ | </ | ||
Hãy viết bằng | Hãy viết bằng | ||
- | MÃ: CHỌN TẤT CẢ | + | |
+ | <code php > | ||
SELECT t1.catid, t1.parentid, | SELECT t1.catid, t1.parentid, | ||
- | 4. Viết câu lệnh và lấy về chỉ số tăng tự động | + | </ |
+ | ==== 4. Viết câu lệnh và lấy về chỉ số tăng tự động | ||
Trước chúng ta viết | Trước chúng ta viết | ||
- | MÃ: CHỌN TẤT CẢ | + | |
+ | <code php > | ||
$sql = " | $sql = " | ||
(catid, parentid, title, titlesite, alias, description) | (catid, parentid, title, titlesite, alias, description) | ||
VALUES | VALUES | ||
(NULL, :parentid, :title, :titlesite, :alias, : | (NULL, :parentid, :title, :titlesite, :alias, : | ||
- | Và dùng | + | |
+ | </ | ||
+ | |||
+ | Và dùng | ||
+ | |||
+ | <code php > | ||
+ | |||
$sth = $db-> | $sth = $db-> | ||
$sth-> | $sth-> | ||
$sth-> | $sth-> | ||
+ | </ | ||
Thì cần viết lại theo cách | Thì cần viết lại theo cách | ||
- | MÃ: CHỌN TẤT CẢ | + | |
+ | <code php > | ||
$sql = " | $sql = " | ||
( parentid, title, titlesite, alias, description) | ( parentid, title, titlesite, alias, description) | ||
Dòng 192: | Dòng 223: | ||
$newcatid = $db-> | $newcatid = $db-> | ||
+ | </ | ||
+ | ==== 5. Khi câu lệnh có Limit cần sử dụng lớp $db để tạo câu lệnh SQL ==== | ||
- | 5. Khi câu lệnh có Limit cần sử dụng lớp $db để tạo câu lệnh SQL | + | <code php > |
- | MÃ: CHỌN TẤT CẢ | ||
$db-> | $db-> | ||
- | -> | + | |
- | ->from( NV_PREFIXLANG . ' | + | -> |
- | ->where( ' | + | -> |
- | $all_page = $db-> | + | $all_page = $db-> |
- | $db-> | + | |
- | -> | + | $db-> |
- | ->limit( $per_page ) | + | -> |
- | -> | + | -> |
- | $result = $db-> | + | -> |
+ | $result = $db-> | ||
+ | |||
+ | </ | ||
Ngoài ra nếu câu lệnh SQL có sử dụng SQL_CALC_FOUND_ROWS, | Ngoài ra nếu câu lệnh SQL có sử dụng SQL_CALC_FOUND_ROWS, | ||
- | 6. Không sử dụng REPLACE INTO trong câu lệnh SQL, thay vì đó hãy sử dụng INSERT hay update | + | |
+ | ==== 6. Không sử dụng REPLACE INTO trong câu lệnh SQL ==== | ||
+ | |||
+ | |||
+ | thay vì đó hãy sử dụng INSERT hay update | ||
Nguyên nhân REPLACE INTO chỉ dùng được trên MySQL, ngoài ta REPLACE INTO nếu chạy trên MySQL với Storage Engine InnoDB thực chất cũng dùng hai câu lệnh DELETE và INSERT cùng lúc | Nguyên nhân REPLACE INTO chỉ dùng được trên MySQL, ngoài ta REPLACE INTO nếu chạy trên MySQL với Storage Engine InnoDB thực chất cũng dùng hai câu lệnh DELETE và INSERT cùng lúc | ||
- | 7. PDOStatement :: rowCount () trả về số hàng bị ảnh hưởng bởi cuối cùng DELETE, INSERT, hoặc UPDATE thực hiện bởi các đối tượng PDOStatement tương ứng. | + | |
+ | ==== 7. PDOStatement :: rowCount () ==== | ||
+ | |||
+ | |||
+ | trả về số hàng bị ảnh hưởng bởi cuối cùng DELETE, INSERT, hoặc UPDATE thực hiện bởi các đối tượng PDOStatement tương ứng. | ||
Không sử dụng đối với câu lệnh SQL SELECT do trên Oracle không chạy | Không sử dụng đối với câu lệnh SQL SELECT do trên Oracle không chạy | ||
Nếu viết | Nếu viết | ||
- | $result = $db-> | + | |
- | if( $result-> | + | <code php > |
- | { | + | |
- | // | + | $result = $db-> |
+ | if ($result-> | ||
+ | // | ||
} | } | ||
+ | |||
+ | </ | ||
+ | |||
Cần viết thành | Cần viết thành | ||
- | MÃ: CHỌN TẤT CẢ | + | |
- | $result = $db-> | + | <code php > |
- | if( $result-> | + | |
- | { | + | $result = $db-> |
+ | if ($result-> | ||
// | // | ||
} | } | ||
+ | </ | ||
+ | ==== 8. Sử dụng Prepares a statement ==== | ||
- | 8. Sử dụng Prepares a statement | ||
PDOStatement:: | PDOStatement:: | ||
PDOStatement:: | PDOStatement:: | ||
Dòng 234: | Dòng 284: | ||
- Nếu cần gán giá trị > 400 ký tự bắt buộc phải dùng PDOStatement:: | - Nếu cần gán giá trị > 400 ký tự bắt buộc phải dùng PDOStatement:: | ||
- | MÃ: CHỌN TẤT CẢ | + | <code php > |
- | $sth = $db-> | + | |
+ | $sth = $db-> | ||
$len = strlen($bodyhtml); | $len = strlen($bodyhtml); | ||
- | $sth-> | + | $sth-> |
$sth-> | $sth-> | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== VI. INSERT CSDL trong PDO ===== | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | $stmt = $db-> | ||
+ | send_to = :send_to, | ||
+ | subject = :subject, | ||
+ | message = :message, | ||
+ | status = ' . intval($data[' | ||
+ | finish = ' . intval($data[' | ||
+ | |||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | |||
+ | if ($data[' | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ===== VII. Update CSDL trong PDO ===== | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | $stmt = $db-> | ||
+ | subject = :subject, | ||
+ | send_to = :send_to, | ||
+ | message = :message, | ||
+ | status = ' . intval($data[' | ||
+ | WHERE newsletter_id=' | ||
+ | |||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | if ($stmt-> | ||
+ | } | ||
+ | $stmt-> | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== VIII. Xóa CSDL ===== | ||
+ | |||
+ | có 2 cách xóa nhưng có 3 phương thức xóa | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | // Sử dụng mysqli | ||
+ | $db-> | ||
+ | |||
+ | // Sử dụng PDO theo phương thức bindParam đối với string send_to | ||
+ | $stmt = $db-> | ||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | |||
+ | // Sử dụng PDO theo phương thức $db-> | ||
+ | $stmt = $db-> | ||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | $stmt-> | ||
+ | |||
+ | </ | ||
+ | ===== Truy vấn khác ===== | ||
+ | |||
+ | ==== Truy vấn phân trang trong Nukeviet 4x ==== | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | $per_page = 30; | ||
+ | |||
+ | $page = $nv_Request-> | ||
+ | |||
+ | $sql = $db_config[' | ||
+ | |||
+ | $num_items = $db-> | ||
+ | |||
+ | $base_url = NV_BASE_ADMINURL . ' | ||
+ | |||
+ | $generate_page = nv_generate_page($base_url, | ||
+ | |||
+ | $db-> | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | |||
+ | $result = $db-> | ||
+ | |||
+ | $array_content = array(); | ||
+ | |||
+ | while ($rows = $result-> | ||
+ | $array_content[] = $rows; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | ==== Truy vấn một số trường trong CSDL ==== | ||
+ | |||
+ | có 2 cách | ||
+ | |||
+ | === Cách 1: === | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | $sql = ' | ||
+ | |||
+ | $result = $db-> | ||
+ | |||
+ | $array_content = array(); | ||
+ | |||
+ | while (list ($newsletter_id, | ||
+ | $array_content[] = array( | ||
+ | ' | ||
+ | ' | ||
+ | ); | ||
+ | } | ||
+ | $result-> | ||
+ | |||
+ | </ | ||
+ | |||
+ | === Cách 2 === | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | $sql = ' | ||
+ | |||
+ | $result = $db-> | ||
+ | |||
+ | $array_content = array(); | ||
+ | |||
+ | while ($rows = $result-> | ||
+ | $array_content[] = $rows; | ||
+ | } | ||
+ | $result-> | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Truy vấn 1 trường csdl lấy 1 record duy nhất ==== | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | $sql = ' | ||
+ | |||
+ | $result = $db-> | ||
+ | |||
+ | list ($newsletter_id, | ||
+ | |||
+ | $result-> | ||
+ | |||
+ | </ | ||
+ | |||
+ | Truy vấn tính tổng số dòng có trong 1 bảng CSDL | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | $result = $db-> | ||
+ | |||
+ | list ($total) = $result-> | ||
+ | |||
+ | $result-> | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== CSDL có chứa kiểu float để giá trị không bị biến đổi ==== | ||
+ | |||
+ | |||
+ | đối với csdl có chứa kiểu float để giá trị không bị biến đổi trong truy vấn bạn cần làm như sau | ||
+ | |||
+ | <code php > | ||
+ | |||
+ | // chuyển đổi chế độ giá trị từ number sang string : true, number: false | ||
+ | $db-> | ||
+ | |||
+ | $db-> | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | |||
+ | $result = $db-> | ||
+ | |||
+ | $array = array(); | ||
+ | while ($rows = $result-> | ||
+ | $array[] = $rows; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | Đây là kết quả bạn thu được | ||
+ | |||
+ | '' | ||
+ | |||
+ | <code php > | ||
+ | |||
+ | array(9) { | ||
+ | [" | ||
+ | string(10) " | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | '' | ||
+ | |||
+ | <code php > | ||
+ | |||
+ | array(9) { | ||
+ | [" | ||
+ | float(0.80589997768402) | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | Sự an toàn của truy vấn tham số không có hiệu lực khi bạn sử dụng PDO :: ATTR_EMULATE_PREPARES => true . Ứng dụng của bạn phải đảm bảo rằng các dữ liệu được liên kết với các tham số (s) không chứa mã độc hại Transact-SQL. | ||
+ | |||
+ | Ngoài ra bạn có thể sử dụng | ||
+ | |||
+ | <code php > | ||
+ | $item[' | ||
+ | </ | ||
+ | |||
+ | để format lại dữ liệu của bạn trong đó 8 là chỉ số thập phân mà bạn muôn giữ lại |
mysql_nv4.1417000320.txt.gz · Sửa đổi lần cuối: 2014/11/26 18:12 bởi webvang.vn