Вы забыли поставить в ГДЕ пункт:
UPDATE account SET balance=balance-'$cost' WHERE username='steven' LIMIT 1;
Что происходит в вашем запросе
UPDATE account SET balance=balance-'$cost' AND username='steven';
Согласно MySQL Operator Precedence, то вычитание происходит первое, что , для примера, который вы дали, вернет положительное число:
UPDATE account SET balance=(balance-'$cost') AND username='steven';
UPDATE account SET balance=(1700) AND username='steven';
Затем присваивания (=) от имени пользователя к 'Steven' имеет место, который возвращает 'Steven':
UPDATE account SET balance=(1700) AND (username='steven');
UPDATE account SET balance=(1700) AND ('steven');
Затем, (И) логический оператор умирает, преобразует как положительное число и строка для логических значений, как TRUE, а затем Ands их, которая возвращает TRUE:
UPDATE account SET balance=((1700) AND ('steven'));
UPDATE account SET balance=(TRUE AND TRUE);
UPDATE account SET balance=(TRUE);
Наконец, поскольку баланс является числом с плавающей точкой, TRUE преобразуется в число, которое по умолчанию равно 1,0:
UPDATE account SET balance=(TRUE);
UPDATE account SET balance=1;
Это затронет все записи, а не только один для пользователя «стив».
Если ничего не происходит, то почему что-то происходит? т.е. баланс равен 1. Дополнительная двойная кавычка, вероятно, является ошибкой копирования/вставки. Нет, причина, по которой он устанавливается в одном, является логическим арифметическим. Я не мог точно рассказать, что оценивается и как, но 'AND' будет выполнять последний и оценивать значение' true', или 1 как число. –