2016-08-04 95 views
-2

我一直在試圖弄清楚如何保護一些代碼。它所做的只是獲取該行的id,然後從該行的各個數據庫填充頁面。我所看到的所有例子都是關於bind_param的,但我不知道我的情況涉及到什麼。保護mysqli查詢

舊代碼是脆弱:

<?php 

    $con=mysqli_connect("HOST","USER","PASS","DBNAME"); 
    $con->set_charset("utf8"); 
    if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

    if(isset($_GET['id'])) { 
    $txt= $_GET['id']; 
    $result = mysqli_query($con,"SELECT * FROM news where article_id=" . $txt); 

    while($row = mysqli_fetch_array($result)) 
    {    
    ?>  

    // Show something . . . 

    <?php } 

    } 

    mysqli_close($con); 
    ?> 

利用這種單獨的頁上:

<a target="_blank" class="text-center article_hover" href="article.php?id=<?= $row['article_id'] ?>"> 

第一(可悲)嘗試(錯誤):

<?php 

$dbConnection = new PDO('mysql:dbname=DBNAME;host=HOST;charset=utf8', 'USER', 'PASS'); 


$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $dbConnection->prepare('SELECT * FROM news WHERE article_id = ?'); 

$stmt->bind_param('article_id', $_GET['article_id']); 


$stmt->execute(); 


$result = $stmt->get_result(); 


while ($row = $result->fetch_assoc()) {?> 


// Show something . . . 


<?php }?> 

拋出的錯誤是:

Fatal error: Call to undefined method PDOStatement::bind_param()

更新: 使用後:bindParam而不是bind_param。新的錯誤拋出:

Fatal error: Call to undefined method PDOStatement::get_result()

我很抱歉如果我的代碼是可怕的,謝謝你的任何建議。

+1

[我可以在PHP中混合MySQL API?](http://stackoverflow.com/questions/17498216/c an-i-mix-mysql-apis-in-php) - 答案是:不。 –

+1

PDO使用'bindParam()',而不是'bind_param()' –

+1

你現在也使用錯誤的GET數組和Jay編輯,就像你做的 –

回答

3

PDO使用bindParam(),不bind_param()你應該這樣做:

$sth->bindParam(1, $_GET['id'], PDO::PARAM_INT); 

參考bindParam()。順便提一句,data_typePDO::PARAM_INT)是可選的。

您的查詢字符串href="article.php?id=不符合您的GET變量,所以請記我已經改變了$_GET變量以匹配查詢字符串發送... id

UPDATE:刪除此行:

$result = $stmt->get_result(); 

UPDATE:該行需要改變:

while ($row = $result->fetch_assoc()) {?> 

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {?> 
+0

所以這行:$ result = $ stmt-> get_result();不需要? –

+0

不可以,並且它不適用於PDO –

+0

調用非對象的成員函數fetch() –

1

bind_param()方法不存在,你犯了錯誤。 您應該嘗試bindParam()bindValue()而不是bind_param

您還可以使用命名佔位符bindValue()下面給出的示例:

$stmt = $dbConnection->prepare('SELECT * FROM news WHERE article_id = :id'); 
$stmt->bindValue(":id", $_GET['id'], PDO::PARAM_INT); 
$stmt->execute(); 

確保:placeholder should't是引述任何引號,因爲它永遠是當您將其過濾爲int

+0

Jay已經解決了它,你錯過了很多東西。 –

+2

我知道,但我想分享我的知識。 –