2011-01-17 9 views

Odpowiedz

8

Wspomniałeś dwa parametry (o tej samej nazwie) na rachunku przygotowania, jeszcze podać wartość tylko dla pierwszego parametru (to co było o błędzie).

Nie do końca wiadomo, w jaki sposób PDO rozwiązał wewnętrznie problem o tej samej nazwie, ale zawsze można tego uniknąć.

dwa możliwe rozwiązania:

$sql = "select * from $table ". 
     "where " 
     "first_name like concat('%', :fname, '%') or ". 
     "last_name like concat('%', :lname, '%')"; 
$stmt= $DBH->prepare($sql); 
$stmt->bindValue(':fname', $string, PDO::PARAM_STR); 
$stmt->bindValue(':lname', $string, PDO::PARAM_STR); 

$sql = "select * from $table ". 
     "where " 
     "first_name like concat('%', ?, '%') or ". 
     "last_name like concat('%', ?, '%')"; 
$stmt= $DBH->prepare($sql); 
$stmt->bindValue(1, $string, PDO::PARAM_STR); 
$stmt->bindValue(2, $string, PDO::PARAM_STR); 

Nawiasem mówiąc, istniejąca droga zrobiliście nadal ma problemy z SQL injection.

+0

Thx ajreal, dlaczego moja droga nadal jest wrażliwa na wstrzyknięcia? – bart

+0

ponieważ zawarłeś wszystko w pełnym sql, a powinieneś związać dokładną wartość do przeszukania, np. Przykład – ajreal

+0

@ajreal: tylko mała rzecz: brakuje ci. (kropka) pomiędzy '" where "' i '" first_name ... "' – Helmut

Powiązane problemy