2016-05-12 148 views
0

我试图从MySQL数据库中选择数据,
我执行下面的代码:

<?php $_SESSION["dog_park"] = $_GET['keyword'] ?>    

       <div class="review"> <!-- Creating a div with the class 'review --> 


       <!-- but POST varibale in here for dog park name --> 
        <h1><?php echo $_SESSION["dog_park"]; ?></h1> 




<table border="1" cellspacing="5" cellpadding="5" width="100%"> 
    <thead> 
     <tr> 
      <th>Park Name</th> 
      <th>Street</th> 
      <th>Suburb</th> 
      <th>Dog Park Area (m2)</th> 
     </tr> 
    </thead> 
    <tbody> 
    <?php 

     $result = $conn->prepare("SELECT * FROM dog_parks.items where suburb = '$_SESSION[dog_park]'"); 
     $result->execute(); 
     for($i=0; $row = $result->fetch(); $i++){ 
    ?> 
     <tr> 
      <td><label><?php echo $row['Park_Name']; ?></label></td> 
      <td><label><?php echo $row['Street']; ?></label></td> 
      <td><label><?php echo $row['Suburb']; ?></label></td> 
      <td><label><?php echo $row['Dog_Park_Area_(m2)']; ?></label></td> 

     </tr> 
     <?php } ?> 
    </tbody> 
</table> 

当该脚本执行它显示以下错误:
Error Message

它与会话变量有关,如果我为mySQL查询输入一个静态值,它将正确显示表数据,但当$ _SESSION变量存在时会失败。

+1

我不同意重复标志。在使用mySQL时,OP没有问任何有关安全代码的问题,而是为什么他的代码无法工作。 – GrumpyCrouton

+0

问题不在于SQL注入,而是用户遇到的问题是同一个问题。 – chris85

回答

1

该字符串包含引号,它打破了您的SQL字符串封装。使用预先准备好的语句,参数化,问题将消失。

$result = $conn->prepare("SELECT * FROM dog_parks.items where suburb = ?"); 
$result->execute(array($_SESSION[dog_park])); 

你可以阅读更多:

http://php.net/manual/en/pdo.prepared-statements.php
How can I prevent SQL injection in PHP?

正如您查询是为运行:

SELECT * FROM dog_parks.items where suburb = ''Tramway''

(大概,如果您想包括错误的文本消息,而不是图像,我可以提供真正的查询)

这是无效的,因为''是你比较。 Tramway''它不知道该怎么处理。这恰巧是SQL注入发生的方式。

+0

错误消息已修复,谢谢。 不得不在$ _SESSION ['dog_park'] 周围添加引号没有表格数据显示,任何想法? – deluxenathan

+0

你看过我的整个答案? “dog_park”并不是我答案的主要观点。如果“郊区”不等于你的确切字符串,你将不会得到任何记录,你的记录是否有引号? – chris85

+0

是的,谢谢你.. – deluxenathan