2010-04-01 31 views
35

Đã dành thời gian khắc phục sự cố khi một ứng dụng web PHP/MySQL gặp sự cố khi kết nối với cơ sở dữ liệu. Cơ sở dữ liệu có thể được truy cập từ trình bao và phpMyAdmin với cùng một thông tin xác thực và nó không có ý nghĩa.

Hóa ra mật khẩu đã có một dấu $ trong đó:

$_DB["password"] = "mypas$word"; 

Mật khẩu được gửi đi là "mypas" mà rõ ràng là sai.

Cách tốt nhất để xử lý vấn đề này là gì? Tôi đã thoát $ bằng một \

$_DB["password"] = "mypas\$word"; 

và nó hoạt động.

Tôi thường sử dụng $string = 'test' cho các chuỗi có lẽ là cách tôi tránh chạy vào điều này trước đây.

Hành vi này có đúng không? Điều gì nếu mật khẩu này được lưu trữ trong một cơ sở dữ liệu và PHP kéo nó ra - liệu vấn đề này có xảy ra không? Tôi đang thiếu gì ở đây ...

Trả lời

73
$_DB['password'] = 'mypas$word'; 

chuỗi Dấu nháy đơn không được xử lý và được đưa "như nó vốn có". Bạn nên luôn sử dụng các chuỗi trích dẫn đơn trừ khi bạn cần các biến thay thế $ hoặc escape (\ n, \ r, v.v.). Nó nhanh hơn và ít bị lỗi hơn.

+0

Cảm ơn câu trả lời của bạn. Nó xuất hiện đây là một vấn đề của thực hành tốt nhất. Với báo cáo lỗi nghiêm ngặt, điều này có thể đã được chọn nhanh hơn. Từ câu hỏi ban đầu của tôi - đây có phải là vấn đề khi lấy mật khẩu từ cơ sở dữ liệu hay PHP thoát khỏi ký hiệu $? – ncatnow

+0

@ncatnow: nó không thể là một vấn đề bởi vì thay thế chỉ được thực hiện trong chuỗi trích dẫn đôi ("chuỗi"). Khi bạn đọc một chuỗi từ cơ sở dữ liệu, nó được đọc nội bộ bởi PHP, do đó bạn không sử dụng các chuỗi được trích dẫn kép để đặt nó (hoặc thậm chí là các trích dẫn đơn). Hãy tưởng tượng trình biên dịch thay thế tất cả các công cụ $ ** ngay trước khi thiết lập biến. –

+1

Nó chỉ là một vấn đề cho chuỗi được viết trực tiếp trong mã nguồn của bạn, sử dụng dấu ngoặc kép. Chúng phải xuất hiện vật lý "" như $ this "' trong tệp nguồn '.php'. Các chuỗi từ cơ sở dữ liệu, từ một tệp, từ người dùng, v.v., không phụ thuộc vào nội suy. –

3

Chỉ cần đặt nó trong một chuỗi đơn trích dẫn:

$_DB['password'] = 'mypas$word'; 

Chuỗi dụng dấu ngoặc kép sẽ suy biến, nhưng đơn trích dẫn chuỗi sẽ không. Vì vậy, điều đó sẽ giải quyết vấn đề của bạn.

3

sử dụng dấu nháy đơn

$_DB["password"] = 'mypas$word'; 
2

Chỉ cần sử dụng dấu nháy đơn 'thay vì "và nó sẽ không cố gắng và đối xử với $ word như là một biến.

$_DB['password'] = 'mypas$word'; 
2

Strings trích với ngoặc kép được giải thích cho các biến. Độc trích dẫn chuỗi được hiểu theo nghĩa đen.

$a = "one"; 
$b = "$a"; 
echo $b . "\n"; 
$b = '$a'; 
echo $b . "\n"; 

này nên năng suất:

one 
$a 
+0

Và điều gì sau đây? $ a chứa ký hiệu đô la (chuỗi); $ b = $ a? Tôi đã thử điều này, và tiếc là nó không hiển thị ký hiệu đô la. – tildy

+0

Nếu bạn đặt nhiệm vụ trong dấu nháy đơn, nó sẽ hiển thị. $ b = '$ a' sẽ đặt biến b thành chữ '$ a'. –

+0

i có nghĩa là $ a = 'Sách này là $ 148'; $ b = '$ a' không hiển thị cho tôi đoạn văn bản dưới đây Cuốn sách này là $ 148, nhưng nếu $ b = $ a thì nó cố gắng hiển thị biến $ 148 (?). – tildy

10

PHP là interpolatin g biến số $word thành chuỗi mypas$word, như là hành vi bình thường đối với các chuỗi ký tự được mô tả bằng dấu ngoặc kép. Vì $word có lẽ là không xác định, chuỗi nội suy kết quả là mypas.

Giải pháp là sử dụng dấu nháy đơn. Các chuỗi ký tự chuỗi được trích dẫn một lần không trải qua nội suy biến đổi.

3

Các câu trả lời khác đều hoạt động cho đến khi có các dấu nháy đơn được nhúng trong thanh ghi.

Fail:

$_DB['password'] = 'my'pas$word';

Alternatives:

Nếu bạn không có khác thoát khỏi nhân vật, bạn có thể thoát khỏi $ với \$, ví dụ

$_DB['password'] = "my'pas\$word;"

Hoặc có thể đơn giản để thoát khỏi báo giá đơn lẻ, ví dụ:

$_DB['password'] = 'my\'pas$word;'

+0

Tuyệt vời, cảm ơn bạn. Tôi không biết rằng chúng ta có thể thoát khỏi nhân vật. – Reza

1

Tôi chỉ cần chạy qua vấn đề này và cố định nó trước khi việc tìm kiếm chủ đề này. Tôi chắc chắn rằng tất cả các giải pháp với dấu nháy đơn đều hoạt động hoàn hảo. Tôi đã chọn chỉ cần nối đường chuyền mà cũng hoạt động tốt như tôi đã không biết về giải pháp trích dẫn duy nhất .... IE

$db_password = "SamWise" . "$" . "GangiTYloYG"; 
Các vấn đề liên quan