2016-08-04 86 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

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