2010-05-08 29 views
5

Có bất kỳ thư viện xác nhận trọng lượng nhẹ có sẵn cho PHP mà có thể dễ dàng kiểm tra xem một chuỗi hoặc giá trị cụ thể là hợp lệ cho một loại cơ sở dữ liệu được biết đến -Validation thư viện cho PHP/mysql

Something như thế này:

if (is_MEDIUMINT($var)) { 
     $this->db->insert($anothervar); 
} 

Cảm ơn!

+0

Không ai biết điều này? Tôi không thể là người đầu tiên nghĩ rằng điều này có thể hữu ích! – Industrial

+0

BOUNTY đã bật! – Industrial

Trả lời

3

Cơ sở dữ liệu INFORMATION_SCHEMA là một phần của đặc tả ANSI năm 2003, vì vậy bạn có thể sử dụng qua bất kỳ nhà cung cấp DB hỗ trợ nó (MySQL, PostgreSQL , SQLite, MSSQL 2k5 +).

/*public static*/ function is_dbtype($table, $column, $type) { 
    $db = (...)::getInstance(); // assuming PDO 
    $sql = 'SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS '. 
     'WHERE TABLE_NAME = :table AND COLUMN_NAME = :column'; 
    $st = $db->prepare($sql); 
    $st->execute(array(':table' => $table, ':column' => $column)); 
    return ($type == $st->fetchColumn()); 
} 

Thay đổi COLUMN_TYPE thành DATA_TYPE nếu bạn chỉ muốn "varchar" thay vì "varchar (64)". Nếu bạn cần nhiều hơn, có rất nhiều: IS_NULLABLE, NUMERIC_PRECISION, CHARACTER_SET_NAME, v.v.

(Không chắc chắn tôi sẽ sử dụng cá nhân, mặc dù vậy, chức năng is_* thường đủ mà không cần thêm một cuộc gọi cơ sở dữ liệu. cấu trúc của mọi cơ sở dữ liệu trên máy chủ, do đó, cấp quyền đọc cho nó có thể (nên) là một việc lớn. Nếu bạn đang ở trên một máy chủ chia sẻ, bạn có thể sẽ không có quyền truy cập vào nó cả.)

MySQL- chỉ thay thế: làm tương tự nhưng với DESCRIBE [table]. Nó khá rõ ràng mặc dù, bạn sẽ phải cá ra "bigint" trong "bigint (21) unsigned" chính mình nếu đó là tất cả các bạn muốn.

+0

Làm cách nào để xác thực nếu giá trị cụ thể là giá trị cho một loại dữ liệu cụ thể? Điều này chỉ trả về kiểu dữ liệu ... –

+0

Đó là nhiều hơn trong phản ứng để đọc các phản ứng khác, không chắc chắn tôi đã đánh dấu nó là Câu trả lời. Nhưng với I_S/DESCRIBE bạn ít nhất có thể kiểm tra những gì đến từ cơ sở dữ liệu, chỉ cần không phải những gì đang xảy ra. Cá nhân tôi nghĩ rằng phía đầu vào sẽ là một tập thể dục tổng số vô ích miễn là char/varchar/text/nvarchar/etc loại tồn tại . – tadamson

1

Không xa như tôi biết. Bạn có thể, tất nhiên, tạo ra các hàm hoặc lớp của riêng bạn để làm điều này, dựa trên các quy tắc của kiểu cơ sở dữ liệu cụ thể của bạn.

Rất tiếc, tôi không thể trợ giúp thêm. (. Và hạnh phúc khi được giáo dục bởi bất kỳ người dùng khác nếu có một lớp/chức năng ngoài kia)

+0

Cảm ơn Lucanos. Tất nhiên, tôi có thể viết một số dòng để làm điều này, nhưng tôi sẽ giả định rằng tôi không phải là người đầu tiên cần điều này :) – Industrial

6

Đây không phải là đơn giản như có vẻ như, chức năng is_MEDIUMINT() của bạn có thể dễ dàng trở thành:

is_MEDIUMINT() 
is_MEDIUMINT_NULL() 
is_MEDIUMINT_NOTNULL() 
is_MEDIUMINT_UNSIGNED() 
is_MEDIUMINT_UNSIGNED_NULL() 
is_MEDIUMINT_UNSIGNED_NOTNULL() 

Sau đó, bạn chạy vào các vấn đề về cơ sở dữ liệu khác nhau, SQLite ví dụ chỉ có một INT loại trong khi MySQL có ít nhất 5 (TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT), không kể bí danh (ví dụ như INTEGER, BOOL, BOOLEANSERIAL) và f loại loat - sẽ khó thực hiện hơn do đối số chính xác biến đổi. Hãy nhớ rằng tôi vẫn bỏ qua một số tính năng quan trọng như UNIQUE và các ràng buộc khóa ngoại mà chỉ có thể được xác thực trên DB. Tôi không hiểu tại sao bạn cho rằng các chức năng như vậy sẽ hữu ích, bởi vì nếu bạn có thể thiết lập cơ sở dữ liệu của bạn hoạt động ở chế độ nghiêm ngặt và sau đó chỉ cần thử chèn các giá trị, nếu truy vấn thất bại bạn biết có điều gì đó sai, trích dẫn Manual MySQL:

trong nonstrict chế độ, khi một out-of-phạm vi giá trị được gán cho một cột số nguyên, MySQL lưu trữ các giá trị đại diện cho endpoint tương ứng của các kiểu dữ liệu cột phạm vi. Nếu bạn lưu trữ 256 vào cột TINYINT hoặc TINYINT UNSIGNED, thì MySQL lưu trữ 127 hoặc 255, tương ứng.

Bạn có điểm nào xác thực giá trị trước khi chèn không?

if (is_MEDIUMINT($var)) { 
    $this->db->insert($anothervar); 
} 

else { 
    // do what? 
} 

Nếu bạn đang cố gắng tránh các lỗi chạy truy vấn trong giao dịch hoặc sử dụng cú pháp INSERT OR IGNORE.

1

Bạn có đang tìm kiếm các hàm is_* trong PHP không?

is_integer, is_float v.v ...?

Ngoài ra còn có get_type, nhưng nó không nên được sử dụng cho loại hình kiểm tra

2

Đưa vào cơ sở dữ liệu và xem nó có trả về lỗi hay không. Nếu không, bạn gõ đủ tốt. Điều này cũng có nghĩa là các dbms bạn đang sử dụng sẽ xử lý việc định giá, có nghĩa là bạn không phải cập nhật tất cả các chức năng xác nhận của bạn khi họ quyết định thay đổi chúng trên một ý thích. Và bạn sẽ rất có thể không nhận thấy điều này cho đến khi mọi thứ chết đi và bạn không thể giải thích tại sao. Bạn càng phải giữ ít mã hơn để duy trì chính mình, cuộc sống của bạn càng dễ dàng hơn :)