Thứ Năm, 3 tháng 3, 2011

Các lỗi thường gặp trong MySQL của người lập trình PHP

  Cơ sở dữ liệu là một thành phần cơ bản cho các ứng dụng web. Nếu bạn đang sử dụng PHP thì MySQL là ngôn ngữ đi kèm phổ biến nhất.
   PHP là tương đối dễ dàng và hầu hết các người phát triển mới có thể viết mã trong một vài giờ. Tuy nhiên, xây dựng một cơ sở dữ liệu vững chắc, đáng tin cậy cần có thời gian và chuyên môn. Dưới đây là một số sai lầm trong MySQL  tồi tệ nhất tôi đã gặp  ...

1. Sử dụng MyISAM hơn là InnoDB 

     MySQL có một số cơ sở dữ liệu, nhưng bạn có nhiều khả năng gặp phải MyISAM và InnoDB. MyISAM được sử dụng bởi nó mặc định. Tuy nhiên, trừ khi bạn đang tạo ra một cơ sở dữ liệu rất đơn giản, hoặc thử nghiệm, vì nó gần như chắc chắn là sự lựa chọn sai lầm! MyISAM không hỗ trợ ràng buộc khoá ngoại, giao dịch, đó là rất cần thiết cho tính toàn vẹn dữ liệu. Ngoài ra, toàn bộ table đã bị khoá bất cứ khi nào một record được thêm vào hoặc được cập nhật, điều này gây ra một ảnh hưởng bất lợi về hiệu suất khi sử dụng phát triển. 

Giải pháp đơn giản là : sử dụng InnoDB.

2. Sử dụng hàm mysql  củaPHP 
     PHP đã cung cấp các hàm thư viện MySQL. Nhiều ứng dụng dựa vào mysql_query, mysql_connect, mysql_fetch_assoc, v.v... nhưng PHP manual  nói rằng:


Nếu bạn đang sử dụng MySQL phiên bản 4.1.3 hoặc mới hơn khuyên bạn 

nên sử dụng phần mở rộng MySQLi thay vì phần mặc định.
     MySQLi (hoặc phần mở rộng MySQL được cải thiện), có một số lợi thế:

  • Giao diện hướng đối tượng.
  • Các câu leecnhj tiền xử lý (mà giúp ngăn ngừa sự tấn công  SQL-injection và tăng hiệu suất)
  • Hỗ trợ transaction
    Ngoài ra, bạn nên xem xét PDO nếu bạn muốn hỗ trợ nhiều cơ sở dữ liệu.
3. Không xem xét kỹ thông tin người dùng nhập vào
     Không bao giờ tin tưởng người dùng nhập vào, Xác thực bằng mỗi chuỗi nhập vào bằng cách sử dụng  các hàm kiểm tra phía máy chủ PHP hơn là dựa vào javascript. Cách đơn giản tấn công SQL Injection phụ thuộc vào mã như:

$username = $_POST["name"];
$password = $_POST["password"];
$sql = "SELECT userid FROM usertable WHERE username='$username' AND password='$password';";
// run query...
    Điều này có thể bị bẻ khóa bằng cách nhập vào "admin'; --" trong trường username. Các chuỗi SQL sẽ tương đương với:

SELECT userid FROM usertable WHERE username='admin';
   Các cracker có thể đăng nhập như là "admin", họ không cần biết mật khẩu vì nó là chú thích trong SQL. 
4. Không sử dụng UTF-8
    Bạn quên chỉnh dữ liệu ở định dạng UTF-8, khiến nó không thể hiển thị đúng ở một số ngôn ngữ. Mặc dù MySQL không hoàn toàn hổ trợ, nhưng vẫn sẽ tốt hơn khi chuyển về UTF-8.
5. Yêu thích PHP hơn là MySQL
     Khi bạn mới bắt đầu PHP, bạn có xu hướng muốn giải quyết tất cả với PHP. Điều đó có thể dẫn đến các mã không cần thiết và chậm hơn. Ví dụ, thay vì sử dụng hàm AVG() của MySQL, bạn lại sử dụng một vòng lặp PHP để tính trung bình theo tổng hợp tất cả các record trong table
     Nhưng đổi lại, cũng cho các truy vấn SQL vào vòng lặp PHP. Thông thường, nó có hiệu quả hơn để chạy một truy vấn sau đó loop qua các results trả về của câu truy vấn.
     Nhìn chung, tận dụng những thế mạnh của cơ sở dữ liệu của bạn khi phân tích dữ liệu.
 
.

Không có nhận xét nào:

Đăng nhận xét