PDO MySQL обрабатывает апостроф (') в именах - PullRequest
0 голосов
/ 28 апреля 2018

У меня возникают проблемы с запросом 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;

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Вы должны использовать подготовленное заявление.

$stmt = $dbh->prepare("SELECT * from position WHERE spieler= :playername")

if(isset($playername))
{
   $stmt->bindParam(":playername", $playername);
}

$stmt->execute();
0 голосов
/ 28 апреля 2018

Это потому, что когда у вас есть имя с ', ваш запрос выглядит так:

"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>';
}
...