2017-01-20 24 views
-4

私は数値を増やすためにMySQLの値を更新しようとしています。現在の値は50で、テキストボックスに50を入力するとmysqlの値は100になります。現在のテキストボックス値と比較します。あなたが引用符内の列名を持つテキストボックス値からmysql値を増やすには?

 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; 
    } 
} 
+2

1を取り扱う渡すinstaniateとき、それは今

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; } } 

クラスのプロパティでなければなりません。 2.最初のクエリはまったく必要ありません。 3. 2番目のクエリの構文が間違っています。最初に静的な値で試してから、準備されたバージョンのために変更してください。 –

+0

こんにちは。あなたのコードは安全ではありません。 「Prepared Statements」がどのようなもので、どのように機能しているかを見て、正しい方法で実装していない。 – Twinfriends

+0

@YourCommonSense一度私は私の答えを改善したDVを取り除くのに十分な長さにぶら下がってくれてありがとう – RiggsFolly

答えて

1

、あなたがそれを持っているように私は、クエリが失敗し、実際にあることを言うだろうが、あなたはエラーをチェックされていません。この仮定を証明するには、画面から10を渡してテストし、データベース内の50の値が決して変化しないことを確認します。あなたが更新クエリでそれを使用し、キーとしてのコードを使用して行を取得することができれば

あなたはまた、SQLインジェクション

から保護するために、プリペアドステートメントを使用する必要があります。また、あなた最初のクエリは、目的を達成しません。

これはクラスのメソッドであるように見えるので、$ conn変数はglobalを使用して収集されてはならず、クラスのカプセル化が破棄されます。あなたは、オブジェクトがデータベース接続を使用すると、2番目のクエリのために準備されたステートメントを使用していない

$xxx = new xxx($conn); 
$xxx->qty = 30; 
$xxx->updateMaterial($code); 
+0

これはすばらしいリグです。ありがとう –

+0

Woopsは、 'if'ステートメントの入力ミスを修正しました。 – RiggsFolly

関連する問題