我的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;
?>
答案 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;
?>