Công cụ thành viên

Công cụ trang web


mysql_nv4

Khác biệt

Đây là những khác biệt giữa hai phiên bản của trang.

Liên kết đến bản xem so sánh này

Phiên bản trước của cả hai bênPhiên bản trước
Phiên bản sau
Phiên bản trước
mysql_nv4 [2014/11/26 18:15] – [V. Các chú ý trong lập trình CSDL với NukeViet] webvang.vnmysql_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->query(''); 
-   $db->query( '' ); +} catch (PDOException $e) { 
-} +    trigger_error(print_r($e, true));
-catch( PDOException $e ) +
-+
-   trigger_error( $e->getMessage() );+
 } }
 </code> </code>
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->query( 'select SQL_CALC_FOUND_ROWS * from nv3_config LIMIT 0, 30' ); +$result = $db->query('select SQL_CALC_FOUND_ROWS * from nv3_config LIMIT 0, 30'); 
-$rs1 = $db->query( 'SELECT FOUND_ROWS()' ); +$rs1 = $db->query('SELECT FOUND_ROWS()'); 
-$all_page = $rs1->fetchColumn( );+$all_page = $rs1->fetchColumn();
 print("all_page $all_page rows"); print("all_page $all_page rows");
-foreach( $result as $row )// lặp qua từng dòng +foreach ($result as $row) 
-+    // lặp qua từng dòng 
-   printf( 'module: %s<br />config_name: %s <p />', $row['module'], $row['config_name'] );+    printf('module: %s<br />config_name: %s <p />', $row['module'], $row['config_name']);
 } }
- 
 </code> </code>
- 
  
 - 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->exec( "DELETE FROM nv3_config WHERE module = 'khongco'" );+ 
 +<code php> 
 +$count = $db->exec("DELETE FROM nv3_config WHERE module = 'khongco'");
 print("Deleted $count rows"); print("Deleted $count rows");
-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.+</code> 
 + 
 +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.
  
 <code php > <code php >
 $config_name = 'users2'; $config_name = 'users2';
-$del = $db->prepare( 'DELETE FROM nv3_config2 WHERE config_name=:config_name' ); +$del = $db->prepare('DELETE FROM nv3_config2 WHERE config_name=:config_name'); 
-$del->bindValue( ':config_name', $config_name ); +$del->bindValue(':config_name', $config_name); 
-$del->execute( ); +$del->execute();
 </code> </code>
  
Dòng 50: Dòng 49:
 <code php > <code php >
 $module = 'users'; $module = 'users';
-$sth = $db->prepare( "select * from nv3_config WHERE module=:module LIMIT 0, 4" ); +$sth = $db->prepare("select * from nv3_config WHERE module=:module LIMIT 0, 4"); 
-$sth->bindParam( ':module', $module ); +$sth->bindParam(':module', $module); 
-$sth->execute( );+$sth->execute();
 $array = $sth->fetchAll(); $array = $sth->fetchAll();
-var_export( $array );+var_export($array);
 </code> </code>
  
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::FETCH_ASSOC: Trả về dạng mảng (array) + 
-PDO::FETCH_BOTH: Trả về một mảng, key giữa tên cột và giá trị index bắt đầu từ 0 +  * ''PDO::FETCH_ASSOC'': Trả về dạng mảng (array) 
-PDO::FETCH_BOUND: Trả về TRUE và gán các giá trị của các cột trong kết quả tương ứng vào các biến bạn đã thiết lập cho nó. +  * ''PDO::FETCH_BOTH'': Trả về một mảng, key giữa tên cột và giá trị index bắt đầu từ 0 
-PDO::FETCH_CLASS: Trả lại một lớp (class) +  * ''PDO::FETCH_BOUND'': Trả về TRUE và gán các giá trị của các cột trong kết quả tương ứng vào các biến bạn đã thiết lập cho nó. 
-PDO::FETCH_OBJ: Trả về một đối tượng vô danh với tên tương ứng với các cột +  * ''PDO::FETCH_CLASS'': Trả lại một lớp (class) 
-PDO::FETCH_NUM: (Là số 3 ) Trả về một mảng, giá trị index bắt đầu từ 0 +  * ''PDO::FETCH_OBJ'': Trả về một đối tượng vô danh với tên tương ứng với các cột 
-Mặc định, NukeViet sử dụng PDO::FETCH_ASSOC.+  * ''PDO::FETCH_NUM'': (Là số 3 ) Trả về một mảng, giá trị index bắt đầu từ 0 
 + 
 +Mặc định, NukeViet sử dụng ''PDO::FETCH_ASSOC''. 
 + 
 +<code php>
 $sql = 'SELECT * FROM ' . NV_PREFIXLANG . '_' . $module_data . ' WHERE status=1 AND id=' . $id; $sql = 'SELECT * FROM ' . NV_PREFIXLANG . '_' . $module_data . ' WHERE status=1 AND id=' . $id;
-$row = $db->query( $sql )->fetch(); +$row = $db->query($sql)->fetch(); 
-Mặc định, NukeViet sử dụng PDO::FETCH_ASSOC.+</code>
  
 ===== 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->prepare('INSERT INTO ' . NV_PREFIXLANG . '_' . $module_data . ' VALUES(:name)'); $stmt = $db->prepare('INSERT INTO ' . NV_PREFIXLANG . '_' . $module_data . ' VALUES(:name)');
 $stmt->bindParam(':name', $name); $stmt->bindParam(':name', $name);
Dòng 117: Dòng 119:
 $name = 'Steven'; $name = 'Steven';
 $stmt->execute(); $stmt->execute();
- 
  
 // Max Weight // Max Weight
 $_sql = 'SELECT max(weight) FROM ' . NV_PREFIXLANG . '_' . $module_data . ' WHERE catid=' . $catid; $_sql = 'SELECT max(weight) FROM ' . NV_PREFIXLANG . '_' . $module_data . ' WHERE catid=' . $catid;
-$weight = $db->query( $_sql )->fetchColumn(); +$weight = $db->query($_sql)->fetchColumn(); 
-$weight = intval( $weight ) + 1;+$weight = intval($weight) + 1;
 // Fetch Limit // Fetch Limit
 $db->sqlreset() $db->sqlreset()
-  ->select( 'COUNT(*)'+    ->select('COUNT(*)'
-  ->from( NV_PREFIXLANG . '_' . $module_data ) +    ->from(NV_PREFIXLANG . '_' . $module_data) 
-  ->where( 'status=1' ); +    ->where('status=1'); 
-$all_page = $db->query( $db->sql() )->fetchColumn(); +$all_page = $db->query($db->sql()) 
-$db->select( '*'+    ->fetchColumn(); 
-  ->order( 'id DESC' ) +$db->select('*'
-  ->limit( $per_page ) +    ->order('id DESC'
-  ->offset( $page ); +    ->limit($per_page) 
-while( $row = $_query->fetch() ) +    ->offset($page); 
-+while ($row = $_query->fetch()) { 
-    //$id = $row['id'];+    // $id = $row['id'];
 } }
- 
 </code> </code>
  
Dòng 150: Dòng 150:
  
 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
 +
 +<code php >
  
 SELECT `catid`, `parentid`, `title` FROM `nv3_vi_news_cat` SELECT `catid`, `parentid`, `title` FROM `nv3_vi_news_cat`
  
 +</code>
 Thì cần viết lại: Thì cần viết lại:
 +
 +<code php >
  
 SELECT catid, parentid, title FROM nv3_vi_news_cat SELECT catid, parentid, title FROM nv3_vi_news_cat
 +
 +</code>
  
 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:
Dòng 165: Dòng 172:
 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
 +<code php >
  
 SELECT t1.catid, t1.parentid, t1.title FROM nv3_vi_news_cat AS t1 SELECT t1.catid, t1.parentid, t1.title FROM nv3_vi_news_cat AS t1
 +
 +</code>
  
 Hãy viết bằng Hãy viết bằng
 +
 +<code php >
  
 SELECT t1.catid, t1.parentid, t1.title FROM nv3_vi_news_cat t1 SELECT t1.catid, t1.parentid, t1.title FROM nv3_vi_news_cat t1
  
 +</code>
 ==== 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
 +
 +<code php >
  
 $sql = "INSERT INTO " . NV_PREFIXLANG . "_" . $module_data . "_cat $sql = "INSERT INTO " . NV_PREFIXLANG . "_" . $module_data . "_cat
Dòng 180: Dòng 195:
 VALUES VALUES
 (NULL, :parentid, :title, :titlesite, :alias, :description)"; (NULL, :parentid, :title, :titlesite, :alias, :description)";
 +
 +</code>
  
 Và dùng Và dùng
 +
 +<code php >
    
 $sth = $db->prepare($sql); $sth = $db->prepare($sql);
 $sth->bindParam….. $sth->bindParam…..
 $sth->execute(); $sth->execute();
 +</code>
  
 Thì cần viết lại theo cách Thì cần viết lại theo cách
 +
 +<code php >
  
 $sql = "INSERT INTO " . NV_PREFIXLANG . "_" . $module_data . "_cat $sql = "INSERT INTO " . NV_PREFIXLANG . "_" . $module_data . "_cat
Dòng 201: Dòng 223:
 $newcatid = $db->insert_id( $sql, 'catid', $data_insert ); $newcatid = $db->insert_id( $sql, 'catid', $data_insert );
  
 +</code>
 ==== 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 >
  
 $db->sqlreset() $db->sqlreset()
-->select( 'COUNT(*)'+    ->select('COUNT(*)'
-->from( NV_PREFIXLANG . '_' . $module_data . '_rows'+    ->from(NV_PREFIXLANG . '_' . $module_data . '_rows'
-->where( 'status= 1 AND inhome=1' ); +    ->where('status= 1 AND inhome=1'); 
-$all_page = $db->query( $db->sql() )->fetchColumn(); +$all_page = $db->query($db->sql()) 
-$db->select( 'id, catid, listcatid, topicid, admin_id, author, sourceid, addtime, edittime, publtime, title, alias, hometext, homeimgfile, homeimgalt, homeimgthumb, allowed_rating, hitstotal, hitscm, total_rating, click_rating'+    ->fetchColumn(); 
-->order(  'id DESC' ) +$db->select('id, catid, listcatid, topicid, admin_id, author, sourceid, addtime, edittime, publtime, title, alias, hometext, homeimgfile, homeimgalt, homeimgthumb, allowed_rating, hitstotal, hitscm, total_rating, click_rating'
-->limit( $per_page ) +    ->order('id DESC'
-->offset( page ); +    ->limit($per_page) 
-$result = $db->query( $db->sql() );+    ->offset(page); 
 +$result = $db->query($db->sql()); 
 + 
 +</code>
  
 Ngoài ra nếu câu lệnh SQL có sử dụng SQL_CALC_FOUND_ROWS, SELECT FOUND_ROWS() để lấy tổng số kết quả truy vấn (các cách này chỉ chạy trên MySQL). Thì khi đó cần viết thành 2 câu lệnh truy vấn tương tự như trên. Ngoài ra nếu câu lệnh SQL có sử dụng SQL_CALC_FOUND_ROWS, SELECT FOUND_ROWS() để lấy tổng số kết quả truy vấn (các cách này chỉ chạy trên MySQL). Thì khi đó cần viết thành 2 câu lệnh truy vấn tương tự như trên.
Dòng 231: Dòng 257:
 Nếu viết Nếu viết
  
-$result = $db->query( "SELECT * FROM " . $db_config['prefix'] . "_" . $lang_data . "_modules where title='news'" ); +<code php > 
-if( $result->rowCount() ) + 
-+$result = $db->query("SELECT * FROM " . $db_config['prefix'] . "_" . $lang_data . "_modules where title='news'"); 
-//+if ($result->rowCount()) { 
 +    //
 } }
 +
 +</code>
  
 Cần viết thành Cần viết thành
  
-$result = $db->query( "SELECT COUNT(*) FROM " . $db_config['prefix'] . "_" . $lang_data . "_modules where title='news'" ); +<code php > 
-if( $result->fetchColumn() ) + 
-{+$result = $db->query("SELECT COUNT(*) FROM " . $db_config['prefix'] . "_" . $lang_data . "_modules where title='news'"); 
 +if ($result->fetchColumn()) {
     //     //
 } }
  
 +</code>
 ==== 8. Sử dụng Prepares a statement ==== ==== 8. Sử dụng Prepares a statement ====
  
Dòng 254: Dòng 284:
 - Nếu cần gán giá trị > 400 ký tự bắt buộc phải dùng PDOStatement::bindParam và phải có cả độ dài của chuỗi - Nếu cần gán giá trị > 400 ký tự bắt buộc phải dùng PDOStatement::bindParam và phải có cả độ dài của chuỗi
  
 +<code php >
  
-$sth = $db->prepare( 'UPDATE nv3_vi_news_bodyhtml SET bodyhtml = :bodyhtml WHERE id=4' );+$sth = $db->prepare('UPDATE nv3_vi_news_bodyhtml SET bodyhtml = :bodyhtml WHERE id=4');
 $len = strlen($bodyhtml); $len = strlen($bodyhtml);
-$sth->bindParam( ':bodyhtml', $bodyhtml, PDO::PARAM_STR, $len );+$sth->bindParam(':bodyhtml', $bodyhtml, PDO::PARAM_STR, $len);
 $sth->execute(); $sth->execute();
  
 +</code>
 +
 +
 +===== VI. INSERT CSDL trong PDO =====
 +
 +<code php>
 +
 +$stmt = $db->prepare('INSERT INTO ' . $db_config['prefix'] . '_' . $module_data . ' SET
 +      send_to = :send_to,
 +      subject = :subject,
 +      message = :message,
 +      status = ' . intval($data['status']) . ',
 +      finish = ' . intval($data['finish']) . '');
 +
 +$stmt->bindParam(':send_to', $data['send_to'], PDO::PARAM_STR);
 +$stmt->bindParam(':subject', $data['subject'], PDO::PARAM_STR);
 +$stmt->bindParam(':message', $data['message'], PDO::PARAM_STR, strlen($data['message']));
 +$stmt->execute();
 +$stmt->closeCursor();
 +
 +if ($data['newsletter_id'] = $db->lastInsertId()) {
 +}
 +
 +
 +</code>
 +
 +===== VII. Update CSDL trong PDO =====
 +
 +<code php>
 +
 +$stmt = $db->prepare('UPDATE ' . $db_config['prefix'] . '_' . $module_data . ' SET
 +      subject = :subject,
 +      send_to = :send_to,
 +      message = :message,
 +      status = ' . intval($data['status']) . ',
 +   WHERE newsletter_id=' . $data['newsletter_id']);
 +
 +$stmt->bindParam(':subject', $data['subject'], PDO::PARAM_STR);
 +$stmt->bindParam(':send_to', $data['send_to'], PDO::PARAM_STR);
 +$stmt->bindParam(':message', $data['message'], PDO::PARAM_STR, strlen($data['message']));
 +if ($stmt->execute()) {
 +}
 +$stmt->closeCursor();
 +
 +</code>
 +
 +===== 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->query('DELETE FROM ' . $db_config['prefix'] . '_' . $module_data . ' WHERE newsletter_id=' . intval($data['newsletter_id']));
 +
 +// Sử dụng PDO theo phương thức bindParam đối với string send_to
 +$stmt = $db->prepare('DELETE FROM ' . $db_config['prefix'] . '_' . $module_data . ' WHERE send_to=: send_to, newsletter_id=' . intval($data['newsletter_id']));
 +$stmt->bindParam(':send_to', $data['send_to'], PDO::PARAM_STR);
 +$stmt->execute()
 +$stmt->closeCursor();
 +
 +// Sử dụng PDO theo phương thức $db->quote đối với string send_to
 +$stmt = $db->prepare('DELETE FROM ' . $db_config['prefix'] . '_' . $module_data . ' WHERE send_to= ' . $db->quote($data['send_to']) . ', newsletter_id=' . intval($data['newsletter_id']));
 +$stmt->bindParam(':send_to', $data['send_to'], PDO::PARAM_STR);
 +$stmt->execute()
 +$stmt->closeCursor();
 +
 +</code>
 +===== Truy vấn khác =====
 +
 +==== Truy vấn phân trang trong Nukeviet 4x ====
 +
 +<code php>
 +
 +$per_page = 30;
 +
 +$page = $nv_Request->get_int('page', 'get', 1);
 +
 +$sql = $db_config['prefix'] . '_' . $module_data;
 +
 +$num_items = $db->query('SELECT COUNT(*) FROM ' . $sql)->fetchColumn();
 +
 +$base_url = NV_BASE_ADMINURL . 'index.php?' . NV_NAME_VARIABLE . '=' . $module_name . '&amp;' . NV_OP_VARIABLE . '=main&amp;per_page=' . $per_page;
 +
 +$generate_page = nv_generate_page($base_url, $num_items, $per_page, $page);
 +
 +$db->sqlreset()
 +    ->select('*')
 +    ->from($sql)
 +    ->order('weight ASC')
 +    ->limit($per_page)
 +    ->offset(($page - 1) * $per_page);
 +
 +$result = $db->query($db->sql());
 +
 +$array_content = array();
 +
 +while ($rows = $result->fetch()) {
 +    $array_content[] = $rows;
 +}
 +
 +</code>
 +==== Truy vấn một số trường trong CSDL ====
 +
 + có 2 cách
 +
 +=== Cách 1: ===
 +
 +<code php>
 +
 +$sql = 'SELECT newsletter_id, send_to FROM ' . $db_config['prefix'] . '_' . $module_data . ' WHERE newsletter_id = 1 ORDER BY newsletter_id ASC LIMIT 0, 20';
 +
 +$result = $db->query($sql);
 +
 +$array_content = array();
 +
 +while (list ($newsletter_id, $send_to) = $result->fetch(3)) {
 +    $array_content[] = array(
 +        'newsletter_id' => $newsletter_id,
 +        'send_to' => $send_to
 +    );
 +}
 +$result->closeCursor();
 +
 +</code>
 +
 +=== Cách 2 ===
 +
 +<code php>
 +
 +$sql = 'SELECT newsletter_id, send_to FROM ' . $db_config['prefix'] . '_' . $module_data . ' WHERE newsletter_id = 1 ORDER BY newsletter_id ASC LIMIT 0, 20';
 +
 +$result = $db->query($sql);
 +
 +$array_content = array();
 +
 +while ($rows = $result->fetch()) {
 +    $array_content[] = $rows;
 +}
 +$result->closeCursor();
 +
 +</code>
 +
 +==== Truy vấn 1 trường csdl lấy 1 record duy nhất ====
 + 
 +<code php>
 +
 +$sql = 'SELECT newsletter_id, send_to FROM ' . $db_config['prefix'] . '_' . $module_data . ' WHERE newsletter_id = 1 ORDER BY newsletter_id ASC LIMIT 0, 1';
 +
 +$result = $db->query($sql);
 +
 +list ($newsletter_id, $send_to) = $result->fetch(3);
 +
 +$result->closeCursor();
 +
 +</code>
 +
 +Truy vấn tính tổng số dòng có trong 1 bảng CSDL
 +
 +<code php>
 +
 +$result = $db->query('SELECT COUNT(*) FROM ' . $db_config['prefix'] . '_' . $module_data);
 +
 +list ($total) = $result->fetch(3);
 +
 +$result->closeCursor();
 +
 +</code>
 +
 +
 +
 +==== 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->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
 +
 +$db->sqlreset()
 +    ->select('*')
 +    ->from($sql)
 +    ->limit($per_page)
 +    ->offset(($page - 1) * $per_page);
 +
 +$result = $db->query($db->sql());
 +
 +$array = array();
 +while ($rows = $result->fetch()) {
 +    $array[] = $rows;
 +}
 +
 +</code>
 +
 +Đây là kết quả bạn thu được
 +
 +''$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);''
 +
 +<code php >
 +
 +array(9) {
 +  ["value"]=>
 +  string(10) "0.80589998"
 +}
 +
 +</code>
 +
 +''$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);''
 +
 +<code php >
 +
 +array(9) {
 +  ["value"]=>
 +  float(0.80589997768402)
 +}
 +
 +</code>
 +
 +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['value'] = number_format($item['value'], 8, '.', '');
 +</code>
 +
 +để 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.1417000556.txt.gz · Sửa đổi lần cuối: 2014/11/26 18:15 bởi webvang.vn