为什么我的SQL查询不起作用

时间:2016-07-16 17:24:47

标签: php mysql sql

我的SQL查询不起作用(#34; UPDATE ......")MySQL没有返回任何错误,UPDATE查询不更新任何内容

这是我的代码:

<?php
print_r($_POST);
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=perso;charset=utf8', 'root', 'root');
}
catch (Exception $e)
{
    die('Erreur : ' . $e->getMessage());
}
$query = "SELECT * FROM money WHERE name='" . $_GET['name'] . "'";
foreach($bdd->query($query) as $val)
{
    $name = $val['name'];
    $balance = $val['balance'];
}
$balance = $balance + $_POST['money'];
echo $balance;
$query = "UPDATE money SET balance = " . $balance . " WHERE name = '" . $_GET['name'] . "'";
echo $query;
?>

1 个答案:

答案 0 :(得分:0)

原因是你没有执行你的陈述,把这一行添加到你的代码中你应该很好......

$bdd->query($query);

然而,这是一种非常糟糕的做事方式,您对SQL注入攻击持开放态度,因为您没有准备(转义)您的字符串。最好的方法是使用参数,然后将它们绑定到准备好的语句,就像这样......

设置您的查询,将用户的数据保留在外,因此=之后的任何内容都应替换为?,如此

$query = "SELECT * FROM money WHERE name=?";

此外,请勿在问号周围加上引号,PDO会在您绑定参数时自动执行此操作。

接下来,你需要准备你的陈述,就像这样......

$preparedStatement = $bdd->prepare($query);

然后,您可以将参数绑定到语句。如果您只有一个,在您的情况下,您只需这样做......

$preparedStatement->bindParam(1, $_GET['name']); //This is binding $_GET['name'] to the first question mark in the query, which is after name=.

如果要绑定多个参数,只需将1替换为问号的位置,并对所用参数的数量重复相同的过程。

如果你有很多参数,你也可以使用迭代和数组(使用for和foreach循环)来节省你自己写代码和代码行。

希望这有帮助!

修改

如果您实施我推荐的所有内容,您的新代码将如下所示......

<?php
print_r($_POST);
try{
    $bdd = new PDO('mysql:host=localhost;dbname=perso;charset=utf8', 'root',     'root');
}
catch (Exception $e){
    die('Erreur : ' . $e->getMessage());
}

$query = "SELECT * FROM `money` WHERE `name`=?"; //Replacing the     concatenation with parameters.
$pStatement = $bdd->prepare($query); //Preparing your statement. This closes     your vulnrability to attack.
$pStatement->bindParam(1, $_GET['name']); //Binding $_GET['name']
$pStatement->execute(); //Execute the statement.

foreach($pStatement->fetchAll(PDO::FETCH_ASSOC) as $val){ //Fetching all     from the executed statement as an associative array.
    $name = $val['name'];
    $balance = $val['balance'];
}

$balance = $balance + $_POST['money'];
echo $balance;
$query = "UPDATE money SET balance = " . $balance . " WHERE name = '" .     $_GET['name'] . "'";
echo $query;
?>