2017-02-13 4 views
1

У меня есть таблица MySQL с целым столбцом в ней, которая называется count, и я пытаюсь выполнить базовую математику, а затем обновить значение. Вот пример одной такой задачи, которую я пытаюсь сделать.MySQL к PHP Integer Math

$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. В одном конкретном примере выполнения $count был равен 84, поэтому он передал оператор if. Но вместо $newCount, установленного на 83, он получает значение -1.

У меня такое чувство, что это связано с тем, что значение MySQL обрабатывается как строка вместо целого числа, но я думал, что intval() решит это. Я также попытался использовать (int) вместо этого, но никакой разницы.

+0

'эхо $ count' до этого, если заявление и проверить его значение – affaz

+2

Вполне возможно, что граф является зарезервированным словом, и нуждается кавычку в запросе (это делает его неудачу и быть«ложь», которая разливается в 0 , то 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) присваивает значение 0 - $count, независимо от чего-либо еще. Затем он проверяет это значение 0, которое равно falsey, в результате чего блок оператора if будет пропущен, а return -1 никогда не выполняется. Это то же самое, что и в случае, если вы написали if (0).
  3. $newCount присваивается значение $count - 1 или -1 во всех случаях, так как $count всегда будет 0.
  4. Затем запрос выполняется, UPDATE ИНГ строку с, никто иной, как наш друг -1.
1

Линия

if ($count = 0) 

следует читать

if ($count === 0) 

Это потому, что вы присваиваете значение, а не с помощью оператора сравнения. Вот некоторые полезные указания относительно операторов в php http://www.w3schools.com/php/php_operators.asp Надеюсь, что это поможет!

+1

Чтобы отметить разницу между двумя операторами, предложенными в приведенных выше ответах, == вернет true после типа juggling (string, int, double, bool и т. д.), а === вернет true, только если они одного типа (в этом случае integer). – Inkdot

1

Ваша ошибка хорошо определена Ic в вашем списке ответов.

Я думаю, что ваш код немного длиннее, его можно сделать с более короткой формой в одном запросе вместо того, чтобы вводить два запроса - сначала выберите и получите значение счета и обновите его, вы можете добиться этого одним запросом, как показано ниже -

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