2012-02-12 44 views
6

Tôi nhận được điều này:Mảng tìm nạp MySQL thêm các giá trị trùng lặp?

Array 
(
[0] => 1 
[id] => 1 
[1] => 778613c4344dbc9565c359c1154c6a18 
[session] => 778613c4344dbc9565c359c1154c6a18 
[2] => fn 
[first_name] => fn 
[3] => ln 
[last_name] => ln 
[4] => un 
[username] => un 
[5] => 016e6128e8ca9dda1b310c364d9b622c 
[password] => 016e6128e8ca9dda1b310c364d9b622c 
[6] => address 
[email] => address 
[7] => 100 
[permission] => 100 
[8] => 10 
[year_level] => 10 
[9] => 
[department] => 
[10] => Sample 
[campus] => Sample 
[11] => 0 
[logo_url] => 0 
) 

Sau khi chạy này

$user = mysql_fetch_array(mysql_query("SELECT session FROM users WHERE username='$cookie[username]' AND first_name='$cookie[first_name]' AND last_name='$cookie[last_name]' AND campus='$cookie[campus]' AND id='$cookie[id]'")) 

Bất cứ ý tưởng tại sao nó được sao chép như thế này? Cảm ơn

EDIT: Tôi nghĩ rằng khóa chính đang thực hiện việc này. Bất kỳ ý tưởng về làm thế nào để ngăn chặn nó?

Trả lời

13

Nếu bạn không chỉ định một loại kết quả như một tham số thứ hai, mysql_fetch_array() sẽ mặc định MYSQL_BOTH(trích dẫn):

Bằng cách sử dụng MYSQL_BOTH (mặc định), bạn sẽ nhận được một mảng với cả hai chỉ số liên kết và số .


Nếu đây không phải là thứ bạn muốn, bạn phải chuyển tham số thứ hai cho hàm đó, để chỉ ra loại kết quả bạn muốn.

Ví dụ, để chỉ nhận được một mảng kết hợp với tên cột như phím:

$result = mysql_query("SELECT session FROM users WHERE username='$cookie[username]' AND first_name='$cookie[first_name]' AND last_name='$cookie[last_name]' AND campus='$cookie[campus]' AND id='$cookie[id]'"); 
$user = mysql_fetch_array($result, MYSQL_ASSOC); 


Là một sidenote:

  • Hãy chắc chắn rằng bạn đang thoát các biến bạn tiêm vào truy vấn của bạn , để ngăn chặn SQL Injections, sử dụng, ví dụ: mysql_real_escape_string()
  • Trước khi sử dụng mysql_fetch_array(), bạn nên kiểm tra xem mysql_query() đã thành công,
  • Và, đặc biệt là đối với một dự án mới, bạn nên sử dụng mysqli hoặc PDO và không sử dụng chức năng mysql_* cũ - xem Choosing an API.
+0

-1 để lặp lại những điều vô nghĩa cũ. thoát không có gì để làm với SQL Injection nhưng thoát khỏi mindless "giá trị" sẽ làm cho tiêm khá tốt. –

+0

Vâng, đảm bảo dữ liệu được chèn vào các truy vấn SQL là * an toàn * phải làm với SQL Injection; và thoát chuỗi là một cách để đảm bảo rằng những người đang * an toàn *; Tuy nhiên, tôi thừa nhận tôi có thể đã thêm rằng cùng một ý tưởng nên được áp dụng cho các giá trị không phải chuỗi, như số nguyên * (đảm bảo chúng thực sự chứa số nguyên, với 'intval()' chẳng hạn) * –

+0

một ảo tưởng cũ một lần nữa. thoát không làm cho dữ liệu * "an toàn" *. nó chỉ là một định dạng. Và chắc chắn bạn phải sử dụng nó (cho dây) không cho bất cứ điều gì an toàn nhưng chỉ để giữ cho SQL của bạn nhất quán.Số nguyên không phải là trường hợp đơn lẻ, định danh là một ví dụ khác về sự vô dụng hoàn toàn và vô dụng của việc thoát ra được coi là "giá trị" "an toàn" –

1

Hãy thử tham số thứ hai MYSQL_ASSOC hoặc MYSQL_NUM. Theo mặc định, MYSQL_BOTH được trả về bằng cả hai phím số và trường.

1

Pascal MARTIN đã giải thích lý do đằng sau nó.

Tôi sẽ cho bạn biết sử dụng mysql_fetch_assoc Nó sẽ chỉ cung cấp cho bạn mảng được liên kết. Phần số sẽ không có mặt.

Các vấn đề liên quan