2015-10-19 121 views
-1

我想第一次使用一些PDO准备语句来防止SQL注入。我对SQL很陌生,所以准备好的语句对我来说非常困惑。你认为我准备好的SQL语句是正确的吗?PDO准备的语句正确吗?

<?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>'; 

    } 
    } 
    } 
    }   
    ?> 

这是我的 “老” 的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>'; 

    } 
    } 
    } 
    }   
    ?> 

谢谢!

+1

我建议你去*代码审查*本网站是关于在社区的问题提供解决方案的编程问题。 * CodeReview *建议改进您的代码。 – Script47

回答

2

您的占位符不应被引用。这使它成为一个文字字符串,而不是占位符。我也不知道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'; 
    } 
} 

? s为占位符的用户值将被插入。 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

+0

我使用的是“htmlspecialchars”,否则用户可以在文本输入中输入一些HTML并销毁该网站:/ – susanloek

+1

您不是在网站上的任何地方输出“$ suche”,但您只是使用它来查询数据库。在数据库中的值是转换为实体或是他们的字符。同样''htmlspecialchars'你也应该编码单引号。 – chris85