我想减少一个值时,用户删除它在php和mysql。我想检查不低于0。如果值是0,那么不要减少。
mysql_query("UPDATE table SET field = field - 1 WHERE id = $number");
如果字段为0,则不执行任何操作
e4yzc0pl1#
添加另一个条件,仅当field大于0时更新
field
0
UPDATE your_table SET field = field - 1 WHERE id = $number AND field > 0
hk8txs482#
您可以使用GREATEST()来防止新值降到零以下。如果值降到零以下,零将始终大于计算值,从而防止使用任何小于零的值。
GREATEST()
UPDATE table SET field = GREATEST(0, field - 1) WHERE id = $number
顺便说一句:请不要再使用mysql_*函数。它们已经过时,最终将从PHP中删除。请改用PDO或MySQLi。
mysql_*
sqserrrh3#
使用GREATEST的选项在较新的MySQL版本中不起作用,如果您想更新多个字段而不是一个字段,则接受的答案可能没有用。
UPDATE table SET field = IF(field > 0, field - 1, 0) WHERE id = $number
qacovj5a4#
UPDATE table SET field = case when (field - 1) >0 then (field - 1) else field end WHERE id = $number
zf2sa74q5#
UPDATE `table_name` SET field = field-1 WHERE `id` = '".$id."' AND field > 0
注意:字段的数据类型应为INTEGER。
iqxoj9l96#
如果字段是int型无符号字段,则最好如下所示:
UPDATE table SET field = field - 1 WHERE id = $number and field > 0 # or UPDATE table SET field = IF(field > 0, field - 1, 0) WHERE id = $number
o4hqfura7#
对于用PDO快速搜索示例的人...
<?php /** * Class Set_quantity_product */ class Set_quantity_product { /** * Set_quantity_product::update_quant_prod( $id, $number, $to_do ); * * @param {int} $id a product id * @param {int} $number a number to increment or decrement for a value in DB * @param {str} $to_do 'incr/decr' * @return {void} increment or decrement but always return 0 if quant < 0 */ public static function update_quant_prod( $id, $number, $to_do ){ $DATA_BASE = new PDO('mysql:host='.$YOUR_HOST.';dbname='.$YOUR_DB_NAME.';charset=utf8', $YOUR_USER_NAME, $YOUR_DB_PASSWORD, array( PDO::ATTR_PERSISTENT => false)); // Note: // UPDATE products // SET quant = GREATEST( 0, quant+:ope ) // WHERE id = :id // increm or decrement but do nothing if quant is > quant in DB // pass quant number to affect to negative for decrement $number = ( $to_do == 'decr' ) ? $number*-1 : $number; // UPDATE ONE PROD. QUANT. 'ope' -> calcul operation $ARR_pdo = array( 'id' => (int) $id, 'ope' => $number ); $sql = 'UPDATE products SET quant = IF(quant+:ope >= 0, quant+:ope, 0) WHERE id=:id'; // prepa. SQL $request = $DATA_BASE->prepare($sql); // exec. request $request->execute($ARR_pdo); // PDO closeCursor $request->closeCursor(); // return true for test return true; } /** * Set_quantity_product::update_quant_prod( $id, $number, $to_do ); */ } /** * Class Set_quantity_product */ ?>
用途:(假设您有一个id=42的产品)
Set_quantity_product::update_quant_prod( 42, 5, 'decr' );
如果您在DB中的数量是6 -〉,则将该值设置为1如果您在DB中的数量是5 -〉,则将该值设置为0如果您在DB中的数量是4 -〉,则将该值设置为0
7条答案
按热度按时间e4yzc0pl1#
添加另一个条件,仅当
field
大于0
时更新hk8txs482#
您可以使用
GREATEST()
来防止新值降到零以下。如果值降到零以下,零将始终大于计算值,从而防止使用任何小于零的值。顺便说一句:请不要再使用
mysql_*
函数。它们已经过时,最终将从PHP中删除。请改用PDO或MySQLi。sqserrrh3#
使用GREATEST的选项在较新的MySQL版本中不起作用,如果您想更新多个字段而不是一个字段,则接受的答案可能没有用。
qacovj5a4#
zf2sa74q5#
注意:字段的数据类型应为INTEGER。
iqxoj9l96#
如果字段是int型无符号字段,则最好如下所示:
o4hqfura7#
对于用PDO快速搜索示例的人...
用途:(假设您有一个id=42的产品)
如果您在DB中的数量是6 -〉,则将该值设置为1
如果您在DB中的数量是5 -〉,则将该值设置为0
如果您在DB中的数量是4 -〉,则将该值设置为0