在查询中使用撇号

Using an apostrophe inside a query

所以使用准备好的语句我试图用'

查询

我有一个名为 $awayteam 的字符串,其中包含:SSS'18 VR1

当我尝试使用上面的字符串查询数据库时,它不起作用....

$conn = new PDO($link, $pdo_username, $pdo_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM clublogo WHERE naam = :name");
//$stmt->bindParam(':name', $awayteam);
$stmt->bindParam(':name', $awayteam, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();
foreach($result as $row){
$awayclublogo = sprintf($row[pad]);

}
$conn = null;

$awayclublogo 将为 NULL

然而,当我只使用 TEXT 时,它确实有效。

$conn = new PDO($link, $pdo_username, $pdo_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM clublogo WHERE naam = :name");
$stmt->bindValue(':name',  "SSS'18 VR1");
$stmt->execute();
$result = $stmt->fetchAll();
foreach($result as $row){
$awayclublogo = sprintf($row[pad]);

}
$conn = null;

好的 所以@Devon 指出问题是由于 HTML 编码。 告诉我查看来源,并确定他是对的。 SSS'18 VR

我正在从数据库中获取变量,例如:

$conn = new PDO($link, $pdo_username, $pdo_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM vrip_uitslag WHERE GameID =     :name");
$stmt->bindParam(':name', $gameid);
$stmt->execute();
$result = $stmt->fetchAll();


foreach($result as $row) { 
$hometeam = sprintf($row[Thuis]);
$awayteam = sprintf($row[Uit]);
}

var_dump($awayteam) 将产生:string(15) "SSS'18 VR1" 然后我使用 $awayteam 所以我不知道 HTML 编码发生在哪里....

我认为已经确定这是使用准备好的语句解决的,因为您正在使用 PHP。这会自动处理。

一般来说,在 SQL 中,您可以通过几种方式转义它:

在它前面使用另一个撇号(单引号):

'SSS''18 VR1'

在它前面使用反斜杠:

'SSS\'18 VR1'

双引号。添加一个额外的单引号来转义它。

SELECT * FROM clublogo WHERE name = 'SSS''18 VR1'

如果您正在使用 PDO,请使用 prepared statements

$dbh = new PDO("...");
$stmt = $dbh->prepare("SELECT * FROM clublogo WHERE name = :name");
$stmt->bindValue(':name',  "SSS'18 VR1");
$stmt->execute();
$result = $stmt->fetchAll();

如果要使用变量,则必须使用 bindParam

$dbh = new PDO("...");
$stmt = $dbh->prepare("SELECT * FROM clublogo WHERE name = :name");
$stmt->bindParam(':name', $awayteam, PDO::PARAM_STR);
$awayteam = "SSS'18 VR1";
$stmt->execute();
$result = $stmt->fetchAll();

PDO:Prepared statements