我试图在MySQL中更新一个值,增加一个数字。让我们说当前值为50,如果我在文本框中键入50,则mysql值变为100.实际上只有下面的代码才有使用当前文本框值进行更新。
function updateMaterial($code){
global $conn;
$sql = $conn->prepare("SELECT * FROM stock WHERE itemcode = '$code'");
$sql->execute();
while($row = $sql->fetch(PDO::FETCH_ASSOC)){
$this->id = $row['id'];
}
if(isset($_POST['qty'])){
$sql = $conn->prepare("UPDATE stock SET qty='qty +$this->qty' WHERE id='$this->id'");
$sql->execute();
}
}
if(isset($_POST['update'])){
$code = $_POST['itemcode'];
if($addstock->updateMaterial($code)){
return true;
}else{
return false;
}
}
答案 0 :(得分:1)
你在引号中有列名,我会说你的查询实际上是失败的,但是你没有检查错误。为了证明这个假设,通过从屏幕传递10进行测试,看看数据库中50的值永远不会改变。
您还应该使用预准备语句来防止SQL注入
此外,您首先查询没有任何意义,如果您可以使用代码作为密钥获取行,则在更新查询中使用它。
此外,由于这似乎是一个类的方法,因此不应使用global
收集$ conn变量,它会破坏类的封装。它应该是一个类属性
class xxx
{
private $conn;
public function __construct($db_conn)
{
$this->conn = $db_conn;
}
function updateMaterial($code){
$sql = $this->conn->prepare("UPDATE stock SET qty=qty+:incqty
WHERE WHERE itemcode = :code");
$param = array(':incqty'=>$this->qty, ':code'=>$code);
$sql->execute($param);
if ( ! $sql ) {
// while testing
$arr = $sql->errorInfo();
print_r($arr);
exit;
}
}
现在,当您实例化对象时,传递数据库连接句柄
$xxx = new xxx($conn);
$xxx->qty = 30;
$xxx->updateMaterial($code);