[英]Why my SQL query does not work
我的SQL查询不起作用(带有“ 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;
?>
原因是因为您不执行语句,而是将此行添加到代码中,所以您应该很好。
$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;
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.