2009-08-29 41 views
9

Tôi đang cố chạy truy vấn sau và tôi đang gặp sự cố với ký tự đại diện.Sử dụng ký tự đại diện trong câu lệnh đã chuẩn bị - MySQLi

function getStudents() { 
     global $db; 
     $users = array(); 
     $query = $db->prepare("SELECT id, adminRights FROM users WHERE classes LIKE ? && adminRights='student'"); 
     $query->bind_param('s', '%' . $this->className . '%'); 
     $query->execute(); 
     $query->bind_result($uid, $adminRights); 
     while ($query->fetch()) { 
      if (isset($adminRights[$this->className]) && $adminRights[$this->className] == 'student') 
       $users[] = $uid; 
     } 
     $query->close(); 
     return $users; 
    } 

Tôi gặp lỗi báo cáo: Không thể chuyển tham số 2 theo tham chiếu. Lý do tôi cần sử dụng ký tự đại diện là vì dữ liệu của cột chứa các mảng được tuần tự hóa. Tôi đoán, nếu có một cách dễ dàng hơn để xử lý việc này, tôi có thể làm gì?

Cảm ơn trước!

+0

bản sao có thể có của [ Các câu lệnh SQL giống như câu lệnh] (http://stackoverflow.com/questions/618527/sql-like-statement-problems) – outis

Trả lời

16

Bạn phải vượt qua các thông số để bind_param() bằng cách tham khảo, có nghĩa là bạn phải vượt qua một đơn biến (không phải là một chuỗi nối). Không có lý do gì bạn không thể xây dựng một biến như vậy đặc biệt để chuyển vào, mặc dù:

$className = '%' . $this->className . '%'; 
$query->bind_param('s', $className); 
5

Tham số số 2 phải là tham chiếu, không phải là giá trị. Hãy thử

$param = '%' . $this->className . '%'; 
$query->bind_param('s', $param); 
+0

Đúng, như câu đầu tiên trong hướng dẫn sử dụng nói: "Ràng buộc biến vào một câu lệnh chuẩn bị làm tham số" (nhấn mạnh vào các biến) – Zed

0

Đó là lý do tương tự xảy ra trong C++. Khi bạn chuyển một giá trị cho một hàm mà hy vọng đối số là tham chiếu, bạn cần một biến (không phải tạm thời). Vì vậy, đầu tiên tạo một biến và sau đó vượt qua nó.

-4

Những câu trả lời hiện không làm việc cho tôi vì vậy đây là những gì tôi sử dụng thay vì:

$sql = mysql_query("SELECT * FROM `products` WHERE `product_title` LIKE '$userInput%'") or die(mysq_error()); 

Và nó hoạt động tất cả các thời gian.

và chỉ để đầu nó tất cả Tôi chỉ cố gắng hình thức đơn giản nhất và nó làm việc

$sql = "SELECT * FROM `products` WHERE `product_title` LIKE '%".$userInput."%'"; 

Tôi hy vọng điều này sẽ giúp

+1

Truy vấn thứ hai nguy hiểm và sẽ không bao giờ được sử dụng vì nó được mở cho các cuộc tấn công SQL injection. – zzzzBov

+1

Ví dụ hoàn hảo về những gì * không * cần làm. –

7

Một cách khác để làm điều này là:

SELECT id, adminRights FROM users 
    WHERE classes LIKE CONCAT("%", ?, "%") && adminRights='student' 

Đây là tiện dụng trong trường hợp bạn có liên kết động và chỉ muốn thay đổi truy vấn SQL ...

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