2017-02-13 10 views
1

私は基本的な計算をして値を更新しようとしているcountという整数の列を持つMySQLテーブルを持っています。ここに私がやってみたい1つのタスクの例があります。MySQLからPHPへの整数演算

$sql = 'SELECT count FROM triggers WHERE id = ?'; 
$params = array($id); 
$result = sqlsrv_query($connection, $sql, $params); 

$row = sqlsrv_fetch_array($result); 

$count = intval($row[0]); 
if ($count = 0) 
    return -1; 
$newCount = $count - 1; 

$sql = 'UPDATE triggers SET count = ? WHERE id = ?'; 
$params = array($newCount, $id); 
$result = sqlsrv_query($connection, $sql, $params); 

私がいる問題は$newCountは常に-1に等しく、そうcountのデータベースの値が-1に更新されていることです。 1つの特定の例の実行では、$countは84に等しいので、if文を渡しました。しかし、$newCountの代わりに83に設定すると、-1に設定されます。

これは整数ではなく文字列として扱われるMySQLの値と関係がありますが、私はintval()がそれを解決すると考えていました。代わりに(int)を使ってみましたが、違いはありません。

+0

'ますecho $ count'前にif文と0にキャストされ、これは、それが失敗し、「偽」になって(これはカウントが予約語であることも可能だし、クエリでバッククォートを必要とし、その値 – affaz

+2

をチェック、それから1が引かれる)。また、クエリで値を直接更新することをお勧めします。例:http://stackoverflow.com/questions/16277339/decrement-value-in-mysql-but-not-negative –

答えて

5

問題はif ($count = 0)です。 PHPでは、=が代入演算子で、==が等価比較演算子です。

tl; dr:if ($count == 0)を意味します。

(またはif $count === 0$countので、ここでは整数であることが保証されていますが、それは本当に===を使用する。この場合には重要ではないであろう、とのみ明示的に型あいを起動しようとする==を使用しても良いとすることができます

説明:コードをステップバイステップで実行してみましょう。何ここで起こっては次のとおりです。データベースからどのような値に

  1. $count = intval($row[0]);セット$count
  2. if ($count = 0)は、他のものにかかわらず、の値を$countに割り当てます。次に、0というこの値がfalseyであるかどうかをテストし、if文ブロックをスキップし、return -1が実行されないようにします。これは、直接if (0)と書いた場合と同じです。
  3. $newCountは常に持つ行をINGの0
  4. クエリが次に実行され、UPDATE、我々の友人-1以外のどれであろう$countので、すべての場合において$count - 1、又は-1の値が割り当てられます。
1

ライン

if ($count = 0) 

あなたが値を割り当てるのではなく、比較演算子を使用しているためです

if ($count === 0) 

をお読みください。 ここでは、PHPで演算子に関するいくつかの有用な読書ですhttp://www.w3schools.com/php/php_operators.asp 希望に役立つ!

+1

上記の2つの演算子の違いをメモするだけで、==は型の後にtrueを返しますjiggling(string、int、double、boolなどの値)、===は同じ型(この場合は整数)の場合にのみtrueを返します。 – Inkdot

1

あなたの間違いは、Icによって回答リストに明確に定義されています。

私はあなたのコードはもう少し長いと思います。2つのクエリを追加するのではなく、1つのクエリで短いフォームで行うことができます。まず最初に選択してカウント値を取得して更新します。 -

UPDATE triggers 
    // if is like ternary operator condition, true value , false value 
    SET count = IF(count > 0, count - 1, count) 
WHERE id = ?