2009-08-29 17 views
9

Próbuję uruchomić następujące zapytanie i mam problem z symbolem wieloznacznym.Korzystanie z symboli wieloznacznych w przygotowanym oświadczeniu - 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; 
    } 

Dostaję błąd, który stwierdza: Nie można przekazać parametr 2 przez odniesienie. Powodem, dla którego muszę użyć symbolu wieloznacznego, jest to, że dane kolumny zawierają serializowane tablice. Sądzę, że jeśli jest łatwiejszy sposób na poradzenie sobie z tym, co mogę zrobić?

Z góry dziękuję!

+0

możliwy duplikat [ Podobne instrukcje SQL) (http://stackoverflow.com/questions/618527/sql-like-statement-problems) – outis

Odpowiedz

16

Trzeba przekazać parametry do bind_param() przez referencję, co oznacza, że ​​trzeba zdać pojedynczej zmiennej (nie jest łączone ciąg). Nie ma powodu, dla którego nie można skonstruować takiej zmiennej, aby przekazać, ale:

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

Parametr nr 2 musi być odniesieniem, a nie wartością. Spróbuj

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

Prawidłowo, jako pierwsze zdanie w instrukcji mówi: "Powiąż zmienne z przygotowaną instrukcją jako parametrami" (nacisk na zmienne) – Zed

0

To samo dzieje się w C++. Kiedy przekazujesz wartość do funkcji, która oczekuje, że argument będzie referencją, potrzebujesz zmiennej (nie tymczasowej). Najpierw utwórz zmienną, a następnie ją przeprowadź.

-4

Istniejące odpowiedzi nie działa na mnie tak to właśnie użyłem zamiast:

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

I to działa cały czas.

i właśnie do tego wszystkiego po prostu próbowała najprostszą formę i to działało

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

Mam nadzieję, że to pomoże

+1

Drugie zapytanie jest niebezpieczne i powinno *** nigdy nie być używane, ponieważ jest otwarte na ataki SQL injection. – zzzzBov

+1

Doskonały przykład tego, co * nie * robić. –

7

Innym sposobem, aby to zrobić:

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

Jest przydatne w przypadku, gdy masz dynamiczne wiązanie wyniku i chcesz zmienić zapytanie SQL ...