2016-05-12 150 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