PDO prepared Statements 正确吗?
PDO prepared Statements correct?
我第一次尝试使用一些 PDO 准备语句来防止 SQL 注入。我对 SQL 很陌生,所以准备好的陈述让我很困惑。您认为我的 SQL 带有预处理语句的代码正确吗?
<?php
if ( $_SERVER["REQUEST_METHOD"] == 'POST' ) {
$suche = htmlspecialchars($_POST['suche']);
$stmt->bindParam(':suche', $suche);
if (!empty($suche)) {
$sql = new rex_sql;
$sql->debugsql = 0;
$stmt = $sql->prepare("SELECT * FROM rex_downloads WHERE dateiname LIKE '%:suche%' OR projektnummer LIKE '%:suche%' OR teilnehmer LIKE '%:suche%'");
$stmt->execute();
if ($sql->getRows() >= 1) {
for($i = 1; $i <= $sql->getRows(); $i++, $sql->next())
{
$dateiname_suche = $sql->getValue("dateiname");
$datei_projektnummer_suche = $sql->getValue("projektnummer");
$teilnehmer_suche = $sql->getValue("teilnehmer");
$dateidatum_suche = date("d.m.Y",strtotime($sql->getValue("dateidatum")));
$dateizeit_suche = date("H.i",strtotime($sql->getValue("dateidatum")));
$datei_projektseite_suche = $sql->getValue("projektseite");
$suche_download_ausgabe .= '<li><a href="index.php?article_id='.$datei_projektseite_suche.'"></a><i class="fa fa-file-o"></i>'.$dateiname_suche.'<ul><li><i class="fa fa-calendar"></i>'.$dateidatum_suche.' um '.$dateizeit_suche.' Uhr</li><li><i class="fa fa-circle"></i>'.$datei_projektnummer_suche.'</li><li><i class="fa fa-user"></i>'.$teilnehmer_suche.'</li></ul></li>';
}
}
}
}
?>
这是我的 "old" SQL 代码(没有准备好的语句):
<?php
if ( $_SERVER["REQUEST_METHOD"] == 'POST' ) {
$suche = htmlspecialchars($_POST['suche']);
if (!empty($suche)) {
$sql = new rex_sql;
$sql->debugsql = 0;
$sql->setQuery("SELECT * FROM rex_downloads WHERE dateiname LIKE '%$suche%' OR projektnummer LIKE '%$suche%' OR teilnehmer LIKE '%$suche%'");
if ($sql->getRows() >= 1) {
for($i = 1; $i <= $sql->getRows(); $i++, $sql->next())
{
$dateiname_suche = $sql->getValue("dateiname");
$datei_projektnummer_suche = $sql->getValue("projektnummer");
$teilnehmer_suche = $sql->getValue("teilnehmer");
$dateidatum_suche = date("d.m.Y",strtotime($sql->getValue("dateidatum")));
$dateizeit_suche = date("H.i",strtotime($sql->getValue("dateidatum")));
$datei_projektseite_suche = $sql->getValue("projektseite");
$suche_download_ausgabe .= '<li><a href="index.php?article_id='.$datei_projektseite_suche.'"></a><i class="fa fa-file-o"></i>'.$dateiname_suche.'<ul><li><i class="fa fa-calendar"></i>'.$dateidatum_suche.' um '.$dateizeit_suche.' Uhr</li><li><i class="fa fa-circle"></i>'.$datei_projektnummer_suche.'</li><li><i class="fa fa-user"></i>'.$teilnehmer_suche.'</li></ul></li>';
}
}
}
}
?>
谢谢!
不应引用您的占位符。这使它成为文字字符串,而不是占位符。我也不知道 getRows()
和 getValue
是什么。试试这个..
if ( $_SERVER["REQUEST_METHOD"] == 'POST' ) {
$suche = '%' . htmlspecialchars($_POST['suche']) . '%';
$stmt = $sql->prepare("SELECT * FROM rex_downloads WHERE dateiname LIKE ? OR projektnummer LIKE ? OR teilnehmer LIKE ?");
$stmt->execute(array($suche, $suche, $suche));
if ($stmt->rowCount() > 0) {
$suche_download_ausgabe = '';
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$dateiname_suche = $row['dateiname'];
$datei_projektnummer_suche = $row['projektnummer'];
$teilnehmer_suche = $row['teilnehmer'];
$dateidatum_suche = date("d.m.Y",strtotime($row['dateidatum']));
$dateizeit_suche = date("H.i",strtotime($row['dateidatum']));
$datei_projektseite_suche = $row['projektseite'];
$suche_download_ausgabe .= '<li><a href="index.php?article_id='.$datei_projektseite_suche.'"></a><i class="fa fa-file-o"></i>'.$dateiname_suche.'<ul><li><i class="fa fa-calendar"></i>'.$dateidatum_suche.' um '.$dateizeit_suche.' Uhr</li><li><i class="fa fa-circle"></i>'.$datei_projektnummer_suche.'</li><li><i class="fa fa-user"></i>'.$teilnehmer_suche.'</li></ul></li>';
}
} else {
echo 'No results';
}
}
?
是将插入用户值的占位符。 rowCount
是一个 PDO 函数,用于查看查询返回了多少行。 fetch
是另一个用于拉取行的 PDO 函数。 PHP 网站上有这些函数的参考资料和文章。
我也不确定您是否应该 运行 htmlspecialchars
用户输入。数据库中的数据插入时是这样转换的吗?
参考文献:
http://php.net/manual/en/pdostatement.rowcount.php
http://php.net/manual/en/pdostatement.fetch.php
http://php.net/manual/en/pdo.prepared-statements.php
我第一次尝试使用一些 PDO 准备语句来防止 SQL 注入。我对 SQL 很陌生,所以准备好的陈述让我很困惑。您认为我的 SQL 带有预处理语句的代码正确吗?
<?php
if ( $_SERVER["REQUEST_METHOD"] == 'POST' ) {
$suche = htmlspecialchars($_POST['suche']);
$stmt->bindParam(':suche', $suche);
if (!empty($suche)) {
$sql = new rex_sql;
$sql->debugsql = 0;
$stmt = $sql->prepare("SELECT * FROM rex_downloads WHERE dateiname LIKE '%:suche%' OR projektnummer LIKE '%:suche%' OR teilnehmer LIKE '%:suche%'");
$stmt->execute();
if ($sql->getRows() >= 1) {
for($i = 1; $i <= $sql->getRows(); $i++, $sql->next())
{
$dateiname_suche = $sql->getValue("dateiname");
$datei_projektnummer_suche = $sql->getValue("projektnummer");
$teilnehmer_suche = $sql->getValue("teilnehmer");
$dateidatum_suche = date("d.m.Y",strtotime($sql->getValue("dateidatum")));
$dateizeit_suche = date("H.i",strtotime($sql->getValue("dateidatum")));
$datei_projektseite_suche = $sql->getValue("projektseite");
$suche_download_ausgabe .= '<li><a href="index.php?article_id='.$datei_projektseite_suche.'"></a><i class="fa fa-file-o"></i>'.$dateiname_suche.'<ul><li><i class="fa fa-calendar"></i>'.$dateidatum_suche.' um '.$dateizeit_suche.' Uhr</li><li><i class="fa fa-circle"></i>'.$datei_projektnummer_suche.'</li><li><i class="fa fa-user"></i>'.$teilnehmer_suche.'</li></ul></li>';
}
}
}
}
?>
这是我的 "old" SQL 代码(没有准备好的语句):
<?php
if ( $_SERVER["REQUEST_METHOD"] == 'POST' ) {
$suche = htmlspecialchars($_POST['suche']);
if (!empty($suche)) {
$sql = new rex_sql;
$sql->debugsql = 0;
$sql->setQuery("SELECT * FROM rex_downloads WHERE dateiname LIKE '%$suche%' OR projektnummer LIKE '%$suche%' OR teilnehmer LIKE '%$suche%'");
if ($sql->getRows() >= 1) {
for($i = 1; $i <= $sql->getRows(); $i++, $sql->next())
{
$dateiname_suche = $sql->getValue("dateiname");
$datei_projektnummer_suche = $sql->getValue("projektnummer");
$teilnehmer_suche = $sql->getValue("teilnehmer");
$dateidatum_suche = date("d.m.Y",strtotime($sql->getValue("dateidatum")));
$dateizeit_suche = date("H.i",strtotime($sql->getValue("dateidatum")));
$datei_projektseite_suche = $sql->getValue("projektseite");
$suche_download_ausgabe .= '<li><a href="index.php?article_id='.$datei_projektseite_suche.'"></a><i class="fa fa-file-o"></i>'.$dateiname_suche.'<ul><li><i class="fa fa-calendar"></i>'.$dateidatum_suche.' um '.$dateizeit_suche.' Uhr</li><li><i class="fa fa-circle"></i>'.$datei_projektnummer_suche.'</li><li><i class="fa fa-user"></i>'.$teilnehmer_suche.'</li></ul></li>';
}
}
}
}
?>
谢谢!
不应引用您的占位符。这使它成为文字字符串,而不是占位符。我也不知道 getRows()
和 getValue
是什么。试试这个..
if ( $_SERVER["REQUEST_METHOD"] == 'POST' ) {
$suche = '%' . htmlspecialchars($_POST['suche']) . '%';
$stmt = $sql->prepare("SELECT * FROM rex_downloads WHERE dateiname LIKE ? OR projektnummer LIKE ? OR teilnehmer LIKE ?");
$stmt->execute(array($suche, $suche, $suche));
if ($stmt->rowCount() > 0) {
$suche_download_ausgabe = '';
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$dateiname_suche = $row['dateiname'];
$datei_projektnummer_suche = $row['projektnummer'];
$teilnehmer_suche = $row['teilnehmer'];
$dateidatum_suche = date("d.m.Y",strtotime($row['dateidatum']));
$dateizeit_suche = date("H.i",strtotime($row['dateidatum']));
$datei_projektseite_suche = $row['projektseite'];
$suche_download_ausgabe .= '<li><a href="index.php?article_id='.$datei_projektseite_suche.'"></a><i class="fa fa-file-o"></i>'.$dateiname_suche.'<ul><li><i class="fa fa-calendar"></i>'.$dateidatum_suche.' um '.$dateizeit_suche.' Uhr</li><li><i class="fa fa-circle"></i>'.$datei_projektnummer_suche.'</li><li><i class="fa fa-user"></i>'.$teilnehmer_suche.'</li></ul></li>';
}
} else {
echo 'No results';
}
}
?
是将插入用户值的占位符。 rowCount
是一个 PDO 函数,用于查看查询返回了多少行。 fetch
是另一个用于拉取行的 PDO 函数。 PHP 网站上有这些函数的参考资料和文章。
我也不确定您是否应该 运行 htmlspecialchars
用户输入。数据库中的数据插入时是这样转换的吗?
参考文献:
http://php.net/manual/en/pdostatement.rowcount.php
http://php.net/manual/en/pdostatement.fetch.php
http://php.net/manual/en/pdo.prepared-statements.php