У меня возникают проблемы с моим запросом PDO, как только в имени, которое я ищу, есть апостроф, например D'Angelo
, Имена без (‘) внутри имени работают нормально.
try {
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$config['DB_USERNAME'],$config['DB_PASSWORD']);
foreach($dbh->query("SELECT * from position WHERE spieler='$playername'") as $row) {
echo ''.$row['pos'].'</td></tr>';
}
$dbh = null;
}
catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
Обновить:
Таким образом, со всей помощью и намеками на подготовленные заявления я смог заставить это наконец работать.
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$config['DB_USERNAME'],$config['DB_PASSWORD']);
$stmt = $dbh->prepare("SELECT * from position WHERE spieler=:player1");
$stmt->execute(array(":player1" => $player1));
foreach ($stmt as $row) {
echo ''.$row['pos'].'</td></tr>';
}
$dbh = null;
Это потому, что когда у вас есть имя с '
в нем ваш запрос выглядит так:
"SELECT * from position WHERE spieler='D'Angelo'"
что неверно, поэтому $ dbh-> query возвращает false, что является недопустимым аргументом для foreach. Чтобы быстро исправить, вам нужно изменить запрос с
"SELECT * from position WHERE spieler='$playername'"
в
"SELECT * from position WHERE spieler='" . addslashes($playername) . "'"
который даст вам
"SELECT * from position WHERE spieler='D\'Angelo'"
Как уже было отмечено, вы лучше справитесь с подготовленными утверждениями:
$stmt = $dbh->prepare("SELECT * from position WHERE spieler=:playername"$stmt->execute(array(':playername' => $playername));
while ($row = $dbh->fetch_assoc()) {
echo ''.$row['pos'].'</td></tr>';
}
Вы должны использовать подготовленное заявление.
$stmt = $dbh->prepare("SELECT * from position WHERE spieler= :playername")
if(isset($playername))
{
$stmt->bindParam(":playername", $playername);
}
$stmt->execute();