繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM