2010-06-07 30 views
7

Tôi đã luôn luôn bị nhầm lẫn rằng .e, g trong php tôi có tuyên bố sql

$qry = "select * from table where id = $id"; 

bây giờ tôi có thể chèn "$" trực tiếp bên trong dấu ngoặc kép hoặc tôi phải sử dụng

$qry = "select * from table where id =".$id." "; 

hoặc

$qry = 'select * from table where id = $id'; 

hoặc

$qry = 'select * from table where id = '$id''; 

nào là đúng

+1

"trong php tôi có câu lệnh sql" >> thực sự nó không phải là câu lệnh sql. nó là chuỗi php thông thường. nó trở thành câu lệnh khi nó được truyền vào bất kỳ hàm liên quan đến mysql nào. – zerkms

Trả lời

4

Nếu chuỗi nằm trong dấu ngoặc kép, các biến sẽ được đánh giá. Nếu đó là trong dấu nháy đơn, nó là chữ và bạn sẽ nhận được chính xác những gì bạn gõ.

$bar = 42; 
'Foo $bar Baz'   // Foo $bar Baz 
"Foo $bar Baz"   // Foo 42 Baz 
'Foo ' . $bar . ' Baz' // Foo 42 Baz 
'Foo ' . '$bar' . ' Baz' // Foo $bar Baz 
"$bar " . $bar . " $bar" // 42 42 42  

Đây là phần thủ công có liên quan để giải thích đầy đủ:
http://php.net/manual/en/language.types.string.php#language.types.string.parsing

Để đặt dấu ngoặc kép thực tế vào chuỗi, bạn sẽ cần phải thay thế chúng hoặc thoát khỏi chúng.

'"$bar"' // "$bar" 
"'$bar'" // '42' 
'\'$bar\'' // '$bar' 
"\"$bar\"" // "42" 
''$bar'' // syntax error, empty string '' + $bar + empty string '' 

Ngoài ra, what he said.

+0

BTW, nếu bạn gặp khó khăn khi nhớ rằng các biến trong các dấu nháy kép được diễn giải, hãy tưởng tượng tạo các dấu ngoặc kép trong không khí bằng các ngón tay của bạn. Các chuỗi được trích dẫn kép có thể không có nghĩa là những gì bạn thực sự nhập. Như, bạn biết đấy, điều này hoàn toàn "cứng", riiiight? Theo đó "cứng" tôi có nghĩa là 'dễ dàng'. – deceze

4

Không có ở trên, trừ khi $id sẽ xảy ra là SQL trốn thoát rồi. Có thể bạn sẽ muốn sử dụng này, giả sử bạn đang sử dụng MySQL:

$qry = "select * from table where id = '".mysql_real_escape_string($id)."'"; 

Edit: Được rồi, đó là không chính xác. Theo bình luận về câu trả lời của tôi, điều này sẽ làm việc:

$qry = "select * from table where id = ".(int)$id; 
+0

@icktoofay: nếu id là số nguyên - bạn cần phải chuyển nó thành (int) và xóa dấu nháy đơn – zerkms

+0

@zerkms: Augh, tôi nghĩ rằng có thể là trường hợp ... Tôi đoán tôi sẽ chỉnh sửa nó. – icktoofay

+0

những gì không chính xác, mã của tôi đang hoạt động. nếu tôi không sử dụng (int). Tôi chưa từng sử dụng –

0

Cả

$qry = "select * from table where id = $id"; 

$qry = "select * from table where id = " . $id; 

sẽ làm việc và sẽ cung cấp cho bạn cùng giá trị trong $qry. Lưu ý không cần thiết cho ." " bạn đã có vào cuối thứ hai - tất cả những gì làm là nối thêm một không gian, đó là khá vô nghĩa.

Bạn cũng có thể làm

$qry = 'select * from table where id = ' . $id; 

nào không chính xác giống như hai người kia. Tất cả đều "đúng" ở chỗ tất cả đều cho bạn kết quả mong muốn, và tất cả đều có vị trí của họ. Việc đầu tiên là khá kém hiệu quả vì cách PHP xử lý các chuỗi nội suy (xem here để có giải thích sâu), nhưng được cho là sạch hơn và nhanh hơn hai phương thức kia.

0

Tôi đang sử dụng $qry = "SELECT * FROM table WHERE id=$id"; vì tôi nghĩ rằng INT không cần báo giá.

nếu không tôi đang sử dụng $qry = "SELECT * FROM table WHERE name='$name'"; tuy nhiên $ name cần được lọc ...

2

Bạn cũng có thể thử ngoại diên biến rõ ràng trong chuỗi như vậy:

$query = "SELECT * FROM table WHERE id = {$id}"; 

này cho phép bạn làm những thứ như:

$name = "friend"; 
$str = "Hello {$name}s"; // Hello friends 

nơi bạn không thể làm điều đó nếu bạn đã cố gắng:

$str = "Hello $names"; 

Vì nó sẽ cố gắng mở rộng biến được gọi là $ name.

Biến được đính kèm trong dấu nháy đơn không được mở rộng và được coi là chữ, vì vậy 'hey, $ id' sẽ chính xác, thay vì 'hey, 1' dự kiến ​​nếu bạn sử dụng dấu ngoặc kép.

Bạn cũng có thể thử sprintf:

$query = sprintf("SELECT * FROM table WHERE id = %d", $id); 

Như các poster đầu tiên cho biết, chắc chắn khử trùng dữ liệu của bạn trước khi truy vấn được chạy.

0

Có một cách đơn giản để ghi nhớ điều này.

Bằng cách sử dụng các dấu hai chấm " php nói của bạn rằng chuỗi này sẽ được phân tích cú pháp cho các biến php.

bằng cách sử dụng các qoutes hát ' php nói của bạn không chuyển đổi bất kỳ biến nào thành giá trị ở đó.

Nhưng cũng không được ở các toa xe như \ r và \ n bằng cách sử dụng một qoute đơn carriege không được xem xét và nó sẽ in một chữ \ r hoặc \ n, nhưng tôi sử dụng các qoutes kép sẽ được chuyển đổi thành các thực thể có thực tế như

xem những gì tôi đã làm ở đó :)

Hy vọng điều này sẽ hữu ích.

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