Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nhập văn bản và các ký tự đặc biệt và MySQL

Bạn có ý tưởng đúng về việc giữ văn bản trong cơ sở dữ liệu dưới dạng thô. Không chắc chắn tất cả nội dung thực thể HTML dùng để làm gì; bạn không cần phải làm điều đó để chèn cơ sở dữ liệu.

[Lý do duy nhất mà tôi có thể nghĩ đến tại sao bạn có thể cố gắng giải mã thực thể-giải mã đầu vào cho cơ sở dữ liệu là nếu bạn nhận thấy mình đang nhận được các tham chiếu ký tự như Š trong đầu vào gửi biểu mẫu của bạn. Nếu điều đó xảy ra, đó là do người dùng đang nhập các ký tự không tồn tại trong bảng mã được sử dụng bởi trang có biểu mẫu. Hình thức mã hóa này hoàn toàn không có thật vì sau đó bạn không thể phân biệt được đâu là người dùng nhập Š và nhập theo nghĩa đen Š ! Bạn nên tránh điều này bằng cách sử dụng mã hóa UTF-8 cho tất cả các trang và nội dung của mình, vì mọi ký tự có thể đều phù hợp với mã hóa này.]

Các chuỗi trong tập lệnh của bạn phải luôn là văn bản thô không có lối thoát. Điều đó có nghĩa là bạn không làm bất cứ điều gì với chúng cho đến khi bạn xuất chúng vào một ngữ cảnh không phải là văn bản thuần túy. Vì vậy, để đặt chúng vào một chuỗi SQL:

$category= trim($_POST['category']);
mysql_query("SELECT * FROM things WHERE category='".mysql_real_escape_string($category)."'");

(hoặc sử dụng các truy vấn được tham số hóa để tránh phải thoát nó theo cách thủ công.) Khi đưa nội dung vào HTML:

<input type="text" name="category" value="<?php echo htmlspecialchars($category); ?>" />

(bạn có thể xác định một hàm trợ giúp với tên ngắn hơn như function h($s) { echo htmlspecialchars($s, ENT_QUOTES); } nếu bạn muốn giảm số lượng nhập phải thực hiện trong các mẫu.)

Và ... đó là khá nhiều. Bạn không cần phải xử lý các chuỗi đi ra khỏi cơ sở dữ liệu, vì chúng đã là các chuỗi thô. Bạn không cần phải xử lý chuỗi đầu vào (*), ngoài bất kỳ xác thực trường dành riêng cho ứng dụng nào bạn muốn thực hiện.

*:tốt, ngoại trừ nếu magic_quotes_gpc được bật, trong trường hợp này, bạn cần phải stripslashes() mọi thứ đến từ get / post / cookie, hoặc tùy chọn ưa thích của tôi, ngay lập tức thất bại:

if (get_magic_quotes_gpc())
    die(
        'Magic quotes are turned on. They are utterly bogus and no-one should use them. '.
        'Turn them off, you idiot, or I refuse to run. So there!'
    );


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL và mệnh đề LIMIT

  2. Đối tượng của lớp stdClass không thể được chuyển đổi thành chuỗi

  3. Bảng thay thế để cung cấp ràng buộc khóa ngoại

  4. Nhận tất cả người dùng ngoại trừ quản trị viên trong mối quan hệ nhiều người

  5. Sử dụng nhiều cơ sở dữ liệu trong CodeIgniter