Datgs' Blog

Quyết chiến quyết thắng !

Archive for the tag “MysQL”

Sinh mã số theo dải quy định trước

Như đã nói trong comment trước. Em sẽ trình bày một phương pháp sử dụng trường autoincrement để sinh mã số theo dải số quy định trước.

Như các bác thấy, trong thực tế, có rất nhiều trường hợp gặp phải ví dụ như là, mỗi một thành phố có một dải số chứng minh thư riêng chẳng hạn, hoặc trong một nhà máy, ID của mỗi sản phẩm họ quy định một dải số riêng như kem đánh răng thì từ 10000 đến 20000, còn bàn chải thì từ 20001 đến 30000…

Vậy thì làm thế nào? Cách đơn giản mà ta có thể nghĩ ra ngay là sử dụng một cơ chế khóa để luôn đảm bảo quá trình sinh mã được thực hiện theo thứ tự lần lượt. Em sẽ không comment gì cách này nữa.

Cách của em muốn đề cập ở đây là sử dụng một bảng như sau:

CREATE TABLE `seq` (
`CODE` varchar(255) NOT NULL,
`AUTO` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`CODE`),
UNIQUE KEY `CODE` (`CODE`,`AUTO`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1

Sau đó định nghĩa giá trị ban đầu của dải KEMDANHRANG là 9999 và dải BANCHAI là 20000

INSERT INTO `seq` (`CODE`, `AUTO`) VALUES (‘KEMDANHRANG’, ’9999′);
INSERT INTO `seq` (`CODE`, `AUTO`) VALUES (‘BANCHAI’, ’20000′);

Sau đó, nếu bạn muốn tính toán mã tiếp theo của bàn chải chẳng hạn, bạn sử dụng query sau:

replace into seq (`CODE`,`AUTO` ) values (‘BANCHAI’, ”)

Lúc này, giá trị trả về của mysql_insert_id sẽ là auto number tiếp theo của bàn chải (là 20001).

Tương tự như vậy:

replace into seq (`CODE`,`AUTO` ) values (‘KEMDANHRANG’, ”)

Sau truy vấn này, mysql_insert_id trả về 10000 (auto number của dải kem dánh răng).

Tất nhiên để kiểm soát giá trị trên của dài. Sau khi lấy được mã, chúng ta phải tự so sánh giá trị lấy được với giá trị trên để xem mã vừa lấy được có phù hợp hay không.

http://i-php.net/2011/04/sinh-ma-so-theo-dai-quy-dinh-t/

Tại sao tôi lại được khuyến cáo không sử dụng TRIGGER và PROCEDURE của MySQL?

Chào các bác,

Em mới vào Sài Gòn chưa được ít lâu. Hiện đang đi phỏng vấn xin việc. Được mấy công ty rồi, ở trong này cách họ truy vấn lúc phỏng vấn khá là khác biệt so với các công ty em đã làm ở ngoài Hà Nội. Đại khái em thấy họ tập chung vào các kinh nghiệm làm việc thực tế, hơn là lý thuyết chung chung. Đặc biệt là họ chỉ focus vào các yêu cầu của công việc, chẳng đoái hoài gì đến giá trị gia tăng gì sất (cũng hơi là lạ lúc đầu nhưng sau 3 lần phỏng vấn em cũng thấy quen rồi và cũng cho thế là hợp lý, tuyển PHP, MySQL thì sức đâu mà lo đến Java, Python… khác). Khi xin tuyển công ty khác thì em cũng sửa sửa, xóa xóa tùy theo yêu cầu tuyển dụng :D .

À quay lại chủ đề chính. Có một công ty em tuyển có trao đổi một đoạn như sau (với anh xếp Việt Kiều Úc, công ty KiSS Concept):

- Em đã bao giờ sử dụng tính năng như TRIGGER, PROCEDURE trên các dự án của mình chưa?

- Chưa. Em được khuyến cáo là không sử dụng những tính năng đó của MySQL. Thay vì thế, dùng mã PHP.

- Tại sao vậy? Không phải việc của CSDL thì để cho CSDL làm chẳng phải sẽ nhanh hơn rất nhiều sao?

- Việc đó thì em nghĩ là đúng. Em cũng chưa từng tự hỏi vì sao họ lại khuyến cáo như vậy. Về phần em, cũng không thấy phiền hà lắm với việc xử lý tất cả trên PHP. Đôi khi còn rất hữu dụng nữa…

Về nhà em cũng suy nghĩ lại đoạn đó, vả cũng cố nghĩ ra một cách giải thích, các bác xem có hợp lý không nhé:

- Tất nhiên, khai thác triệt để các tính năng do CSDL mang lại là tốt nhất.

- Tuy nhiên khi phát triển các ứng dụng trên PHP và MySQL, các bác nhà ta thường chuẩn bị tư thế sẵn sàng cho việc … vì lý do nào đó, thay đổi cơ sở dữ liệu sử dụng (từ MySQL sang Oracle chẳng hạn). Code tất cả các tính năng trong PHP giảm được sự phức tạp cho việc chuyển đổi này. Vì thế, MySQL chỉ được coi là thùng chứa dữ liệu, chứ các tính năng xử lý dựng sẵn không được coi trọng.

- Xử lý bằng PHP, về sau hệ thống cần phải chịu tải lớn, cần phải tối ưu hóa một số đoạn, việc refactor lại code sẽ dễ sàng hơn.

Có ai có thích giải thích khác không ạ? Các dự án mà các bác làm thì thế nào, có hay dùng TRIGGER & PROCEDURE của MySQL không? Trường hợp nào thì nên sử dụng TRIGGER & PROC?

http://i-php.net/2011/04/tai-sao-toi-lai-duoc-khuyen-cao-khong-su-dung-trigger-va-procedure-cua-mysql/

Viết bài trên i-php.net, PHP addslashes có đủ tốt để chống SQL Injection?

http://i-php.net/2011/02/php-addslashes-co-du-tot-de-chong-sql-injection/

Là bài viết trên i-php.net. Một bài viết rất đơn giản dành cho những ai mới tham gia vào cộng đồng PHP.

Chuyển đổi dữ liệu từ MySQL sang MSSQL

1. Vấn đề

Việc chuyển đổi dữ liệu giữa hai hệ quản trị này thực sự là không cần thiết, bởi vì hai hệ quản trị có sự khác biệt lớn về mục đính, cách tổ chức dữ liệu…

Tuy nhiên, trong thực tế đôi khi vẫn cần phải thế. Vì mục đích lưu trữ hoặc chuyển đổi sang một hệ quản trị khác có tính năng mạnh mẽ hơn như Oracle hoặc MSSQL.

2. Công cụ chuyển đổi trực tiếp

Hãy tìm hiểu, hình như là không có?! Xét cho cùng, điều này là không cần thiết.

3. Nếu cần ?

Đơn giản là sử dụng phpMyAdmin để export dữ liệu ra định dạng MSSQL hoặc Oracle. Sau đó import dữ liệu đó vào các hệ quản trị tương ứng.

Lựa chọn xuất dữ liệu MySQL với phpMyAdmin

Lựa chọn xuất dữ liệu MySQL với phpMyAdmin

4. Lỗi tương thích

Đang tìm hiểu…

Cài đặt apache, php, mysql trên windows (cập nhật)

Chú ý: chỉ áp dụng chính xác cho phiên bản apache2.2.x php5.2.x và mysql 5.x, với các phiên bản khác có thể có một chút đổi khác.

Có thể chỉ phù hợp với những người có kinh nghiệm cài đặt Apache, PHP và MySQL. Nếu hướng dẫn dưới đây là không đầy đủ. Bạn có thể tìm một hướng dẫn chi tiết hơn cho từng mục.

0. Chuẩn bị

Chú ý duy nhất là nếu bạn cài đặt đè lên bản apache cũ, bạn hãy xóa file config cũ đi. Vì khi cài đè apache không đè các file config.

1. Các bộ cài

Apache 2.2.x tải về từ  website http://httpd.apache.org/ (chọn bản MSI installer)

MySQL5.xtải về từ website http://dev.mysql.com/downloads/mysql/5.0.html (chọn bản MSI installer)

PHP5.2.x tải bản zip dành cho windows tại http://www.php.net/downloads.php.

2. Cài đặt

Cài đặt Apache2.2.x bình thường với cấu hình cơ bản là localhost, localhost, <admin email>, 8080 hoặc 80. Chú ý một trong hai cổng 8080 hoặc 80 phải tự do, tức là chưa có dịch vụ nào sử dụng nó.

Cài đặt MySQL5.x bình thường. Đến phần cấu hình next cho đến khi được yêu cầu nhập root password. Bạn nên chọn một password. Với server đang phát triển, thường chọn mật khẩu root là 123456.

PHP giải nén và chú ý ghi nhớ đường dẫn đến thư mục PHP của bạn.

3. Cấu hình

Để Apache2.2.x chạy PHP dưới dạng một module bạn làm như sau

Mở file httpd.conf của Apache (nằm trong thư mục conf, nơi bạn đã cài apache)

Thêm vào httpd.conf đoạn cấu hình

LoadModule php5_module “E:\WEBSERVER\php5\php5apache2_2.dll”
AddType application/x-httpd-php .php
PHPIniDir “E:\WEBSERVER\php5″

LoadModule php5_module “PHP_PATH\php5apache2_2.dll”

AddType application/x-httpd-php .php

PHPIniDir “PHP_PATH”

Với chú ý rằng PHP_PATH là nơi bạn đã giải nén PHP.

Để Apache2.2.x chọn index.php làm trang web mặc định để

Tìm tới dòng

DirectoryIndex index.html

Sửa lại thành

DirectoryIndex index.html index.php

Nếu bạn muốn index.php có ưu tiên cao hơn, bạn có thể chuyển nó về trước index.html

DirectoryIndex index.php index.html

Chuẩn bị file php

Tìm trong thư mục bạn đã giải nén PHP file php5ts.dll và copy nó vào thư mục bin của apache.

Trong thư mục bạn đã giải nén PHP, copy toàn bộ các file *.dll bạn nhìn thấy vào trong thư mục Windows/system32 chú ý chỉ copy file bạn nhìn thấy, không cần copy các file trong thư mục

Bước này chỉ là kinh nghiệm của tôi qua việc cài đặt các phiên bản trước. Có thể trong phiên bản này bước này không còn cần thiết nữa. Tuy nhiên, tôi vẫn thường làm theo cách này và không gặp bất cứ trục trặc nào.

Trong thư mục bạn đã giải nén PHP, copy php.ini-dist và sửa tên file bạn vừa copy thành php.ini.

Bạn sửa luôn php.ini-dist thành php.ini cũng không sao cả.

Cấu hình php.ini

1. Mở file php.ini bằng notepad, notepad++ hay wordpad

2. Tìm trong php.ini từ khóa doc_root và sửa thành

doc_root = APACHE_PATH/htdocs

* Trong đó APACHE_PATH là nơi bạn đã cài đặt apache.

* Chú ý rằng

htdocs là nơi mặc định của apache để đặt các public files (html, php). Bạn có thể cấu hình lại, hoặc dùng virtual host, hoặc dùng Script-Alias… Tuy nhiên, nếu bạn mới bắt đầu sử dụng Apache thì bạn không cần phải quá quan tâm đến vấn đề này. Chỉ cần cấu hình mặc định là được.

3. Tìm trong php.ini từ khóa extension_dir và cấu hình thành

extension_dir = PHP_PATH/ext

* extension_dir là đường dẫn đến nơi bạn để các thư viện mở rộng của PHP

4. Tìm các dòng ;extension=php_*.dll đó là các extension mà php cung cấp cho bạn. Chú ý rằng nếu có ; tức là thư viện đó chưa được sử dụng. Nếu bạn muốn sử dụng thư viện nào, chỉ cần bỏ dấu ; . Các thư viện cần đề dev bao gồm

extension=php_curl.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_mcrypt.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_soap.dll

5. Copy các file *.dll trong thư mục PHP_PATH vào thư  mục system32 của windows (WINDOWS/system32) (nhắc lại một câu ở trên vì thao tác này khá là dễ bị quên)

4. Hoàn thành

Khởi động lại apache là hoàn tất.

MySQL query log configuration

MySQL không có cơ chế lưu lại log của toàn bộ các câu truy vấn (Query). Tuy nhiên, vẫn có trường hợp đặc biệt đối với những câu truy vấn có ảnh hưởng lớn đến hệ thống (execute chậm, tiêu tốn tài nguyên…) được config lại trong my.cnf hoăc my.ini để chọn lựa có ghi lại các câu truy vấn đó hay không.

To enable slow query log, simply add the following line to MySQL configuration file (my.cnf or my.ini), and then restart the MySQL server:log-slow-queries

or

log-slow-queries = [path to the log file]

Replace [path to the log file] with actual path to the slow query log file you want the MySQL to write the log to, which is the optional value.

Sau khi thay đổi thông số, restart lại mysql service là xong.

Còn vấn đề lưu lại các câu truy vấn, có thể áp dụng với từng ứng dụng web. Mỗi ứng dụng web nên xây dựng query history của riêng nó. Và lưu vào một bảng riêng.

Post Navigation

Follow

Get every new post delivered to your Inbox.