[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с вычитанием дроби
Pyroman
Здравствуйте. Возникла проблема.
При выполнении mysql запроса в php скрипте:
mysql_query("UPDATE table1 SET a=a-$b WHERE name='$username'")or die(mysql_error());
возникает ошибка:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '4 WHERE name='MyName'' at line 1
Возникает она исключительно при попытке вычитания десятичных дробей (оба значения имеют типы данных DOUBLE). Может кто-нибудь помочь мне с этой проблемой? Спасибо.
Немного доп. информации:
$b = 0.4
a = 490.0



Спустя 11 минут, 9 секунд (13.04.2012 - 20:00) l@pteff написал(а):
Pyroman,поставь перед a символ переменной

Спустя 8 минут, 57 секунд (13.04.2012 - 20:09) l@pteff написал(а):
сорри, фигню написал в пред.посте ;)
ну а так

mysql_query("UPDATE table1 SET a=a-0.4 WHERE name='$username'")or die(mysql_error());

проходит запрос?

Спустя 7 минут, 10 секунд (13.04.2012 - 20:16) Pyroman написал(а):
Так всё отлично, но мне надо именно, чтобы была переменная.

Спустя 23 минуты, 18 секунд (13.04.2012 - 20:39) l@pteff написал(а):
Тогда пропиши её в запросе в кавычках

mysql_query("UPDATE table1 SET a=a-'$b' WHERE name='$username'")or die(mysql_error());

Спустя 7 минут, 57 секунд (13.04.2012 - 20:47) Pyroman написал(а):
В таком случае значение переменной округляется до целого числа (до 1).

Спустя 10 минут, 35 секунд (13.04.2012 - 20:58) killer8080 написал(а):
а если так?
mysql_query("UPDATE `table1` SET `a` = `a` - ".(float)$b." WHERE `name` = '$username'")or die(mysql_error());

Спустя 2 минуты, 29 секунд (13.04.2012 - 21:00) killer8080 написал(а):
Pyroman
наверно у тебя в дроби запятая, вместо точки.

Спустя 15 минут, 45 секунд (13.04.2012 - 21:16) Pyroman написал(а):
killer8080, нет. Именно точка. Собственно значение $b берётся из БД. Просто не дало бы записать туда запятую вместо точки =) Сейчас попробую ваш способ. Спасибо.

Спустя 2 минуты, 26 секунд (13.04.2012 - 21:19) Pyroman написал(а):
В таком случае кнопка просто не работает (вылетает белый экран при нажатии).

Спустя 3 минуты, 24 секунды (13.04.2012 - 21:22) killer8080 написал(а):
ну тогда так посмотри,

error_reporting(E_ALL);
$sql = "UPDATE `table1` SET `a` = `a` - $b WHERE `name` = '$username'";
mysql_query($sql)or die(mysql_error().'<br><br>query string:<br>'.$sql);

Спустя 43 минуты, 58 секунд (13.04.2012 - 22:06) Pyroman написал(а):
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 WHERE `name` = 'Pyroman2'' at line 1

query string:
UPDATE `realmoney` SET `cash` = `cash` - 0,2 WHERE `name` = 'Pyroman2'

Спустя 13 минут, 48 секунд (13.04.2012 - 22:20) killer8080 написал(а):
Pyroman
что и требовалось доказать, у тебя там запятая.
UPDATE `realmoney` SET `cash` = `cash` - 0,2 WHERE `name` = 'Pyroman2'

Спустя 40 минут, 27 секунд (13.04.2012 - 23:00) Pyroman написал(а):
Как такое может быть? Скрин из таблицы (для другого товара):
http://puu.sh/pqHD

Спустя 1 день, 2 часа, 17 минут, 15 секунд (15.04.2012 - 01:17) Pyroman написал(а):
Эмм... Есть у кого идеи?

Спустя 11 часов, 53 минуты, 34 секунды (15.04.2012 - 13:11) killer8080 написал(а):
какие могут быть идеи в слепую, не видя кода.

Спустя 6 часов, 53 минуты, 18 секунд (15.04.2012 - 20:04) Pyroman написал(а):
Ну я же объяснил... Значение берётся из таблицы. При этом отображение вот тут правильное, но при вычитании почему-то точка заменяется на запятую.
Вот код, который выполняется при нажатии на "купить":
<?php
if( ! defined( 'HACK' ) ) {
die( "Hacking attempt!" );
}
include('config.php');
$idtovara = $_POST['buy'];
$koplate = $_POST['iprice']*$_POST['count'];
$kolichestvo = $_POST['count']*$_POST['icount'];
error_reporting(E_ALL);
$sql = "UPDATE `realmoney` SET `cash` = `cash` - $koplate WHERE `name` = '$username'";
mysql_query($sql)or die(mysql_error().'<br><br>query string:<br>'.$sql);
mysql_query("INSERT INTO goods (id, nickname, item_id, item_amount) VALUES (NULL, '$username', '$idtovara', '$kolichestvo')")or die(mysql_error());
$logtext = "$date : $username купил $nazvanie в количестве $kolichestvo";
$mes = "Вы успешно купили $kolichestvo $nazvanie";
$fp = fopen('123.txt', 'a');
fwrite($fp, $logtext);
fwrite($fp, "\n");
fclose($fp);
?>

Доп информация (код неполный - указаны только переменные и что передаётся):

$result2 = mysql_query("SELECT * FROM donate_shop");
while($shop = mysql_fetch_assoc($result2))
<
INPUT TYPE="HIDDEN" NAME="nazvanie" VALUE ="' . $shop["name"] . '">
<
INPUT TYPE="HIDDEN" NAME="icount" VALUE ="' . $shop["stack"] . '">
<
INPUT TYPE="HIDDEN" NAME="iprice" VALUE ="' . $shop["price"] . '">
<
p><button class="ipsButton" value="' . $shop["item_id"] . '" name="buy" type="submit">Купить</button></p>';

Спустя 38 минут, 45 секунд (15.04.2012 - 20:43) inpost написал(а):
Я всегда дробные числа брал в кавычки:
'2.25' , не помню, но где-то был баг, что 5 - 2.25 - не правильно работало.

А ты уверен, что ты дроби пишешь через точку?

Спустя 34 минуты, 18 секунд (15.04.2012 - 21:17) Pyroman написал(а):
Да. Выше постил скрин из таблицы mysql.

Спустя 1 минута, 19 секунд (15.04.2012 - 21:19) Pyroman написал(а):
Да и как видите, в списке товаров цена отображается через точку (берётся таким же образом).

Спустя 2 часа, 1 минута, 6 секунд (15.04.2012 - 23:20) killer8080 написал(а):
Цитата (Pyroman @ 15.04.2012 - 21:19)
Да и как видите, в списке товаров цена отображается через точку (берётся таким же образом).

Не фига я не вижу. Я вижу что у тебя цена и количество товара зачем то выводится в скрытый инпут user posted image, а на скрине виден селект для выбора количества единиц. Значит этот инпут модифицируется js скриптом? Или как? Возможно там закралась ошибка. Про синтаксические ошибки в цикле вывода я промолчу, видимо echo потерялось с остальной частью контента, которую ты удалил для наглядности.
В начале скрипта поставь этот код, и посмотри что в действительности шлет браузер, чудес не бывает.
if(!empty($_POST))
echo '<pre>'.htmlspecialchars(print_r($_POST, 1)).'</pre>';

Спустя 9 минут, 53 секунды (15.04.2012 - 23:30) Pyroman написал(а):
Первая часть - это файл (целиком), который вызывается при нажатии на "Купить" при помощи include. А вторая часть - я просто показал, что посылается этому файлу (без сохранения правильного синтаксиса smile.gif)

Спустя 4 минуты, 19 секунд (15.04.2012 - 23:34) Pyroman написал(а):
Вот что посылается:
Array
(
[count] => 1.0
[nazvanie] => 123
[icount] => 1
[iprice] => 0.4
[buy] => 269
[price_new] =>
[edit_id] => 269
)

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '4 WHERE `name` = 'Pyroman'' at line 1

query string:
UPDATE `realmoney` SET `cash` = `cash` - 0,4 WHERE `name` = 'Pyroman'
Как можно заметить [iprice] => 0.4
с точкой. А вот почему там преобразуется в запятую - большой вопрос...

Спустя 13 минут, 32 секунды (15.04.2012 - 23:47) killer8080 написал(а):
Перемножив 1 на 0.4 запятая никак сама появится не могла.
Цитата (Pyroman @ 15.04.2012 - 20:04)
$idtovara = $_POST['buy'];
$koplate = $_POST['iprice']*$_POST['count'];
$kolichestvo = $_POST['count']*$_POST['icount'];
error_reporting(E_ALL);
$sql = "UPDATE `realmoney` SET `cash` = `cash` - $koplate WHERE `name` = '$username'";
mysql_query($sql)or die(mysql_error().'<br><br>query string:<br>'.$sql);

это весь код? Больше нет никаких манипуляций с переменной $kolichestvo?

Спустя 1 минута, 20 секунд (15.04.2012 - 23:49) inpost написал(а):
"... `cash` - '".(float)(str_replace(','.'.',$koplate))."' WHERE ...

Спустя 5 минут, 43 секунды (15.04.2012 - 23:55) killer8080 написал(а):
inpost
не ну это самое простое решение, я думаю лучше все таки найти ошибку, а она по любому есть.

PS кстати там у тебе точка закралась между аргументами smile.gif

Спустя 12 минут, 28 секунд (16.04.2012 - 00:07) inpost написал(а):
killer8080
Да, есть. Но не всегда есть возможность перерыть весь "чужой" код и найти идеальное решение. Порой приходится вешать такие костыли. Ну, а я вижу, что тема заходит в тупик.
Искать причину - надо, потому что ТС что-то недоговаривает...

int, float, mysql_real_escape_string - всегда надо вешать, да и кавычки ТС проигнорировал, которые я сказал, что желательно поставить.

Спустя 21 минута, 22 секунды (16.04.2012 - 00:28) Pyroman написал(а):
Что я недоговариваю? smile.gif killer8080, да. Там весь код, который выполняется при нажатии на "Купить".

Спустя 7 минут, 34 секунды (16.04.2012 - 00:36) Pyroman написал(а):
Цитата (inpost @ 15.04.2012 - 20:49)
"... `cash` - '".(float)(str_replace(','.'.',$koplate))."' WHERE ...

Интересно.. В таком случае (точку убрал между аргументами) просто перебрасывает на белую страницу =\

Спустя 11 часов, 47 минут, 36 секунд (16.04.2012 - 12:24) killer8080 написал(а):
нужно было так
"... `cash` - ".(float)str_replace(',', '.', $koplate)." WHERE ..."

а белую страницу показывает потому, что у тебя отключен вывод ошибок в php.ini.

Спустя 2 часа, 5 минут, 57 секунд (16.04.2012 - 14:29) Pyroman написал(а):
Включил вывод ошибок, всё равно белая страница =\

Спустя 3 минуты, 27 секунд (16.04.2012 - 14:33) Игорь_Vasinsky написал(а):
  $sql = "UPDATE `realmoney` SET `cash` = `cash` - $koplate WHERE `name` = '$username'";

$query = mysql_query($sql);

if(!$query)
echo mysql_error().'<br><br>query string:<br>'.$sql;
else
echo 'Запрос: '.$sql.'<br /><b>Полёт нормальный!</b>';

Спустя 5 минут, 13 секунд (16.04.2012 - 14:38) Pyroman написал(а):
Цитата (Игорь_Vasinsky @ 16.04.2012 - 11:33)
  $sql = "UPDATE `realmoney` SET `cash` = `cash` - $koplate WHERE `name` = '$username'";

$query = mysql_query($sql);

if(!$query)
echo mysql_error().'<br><br>query string:<br>'.$sql;
else
echo 'Запрос: '.$sql.'<br /><b>Полёт нормальный!</b>';

Так целые числа он вычитает, а если цена дробная, то товар даёт, но не вычитает цену. Без каких-либо ошибок.

Спустя 3 минуты (16.04.2012 - 14:41) Игорь_Vasinsky написал(а):
формат поля какой в БД?

так попробуй

 $sql = "UPDATE `realmoney` SET `cash` = `cash`-'".$koplate."' WHERE `name` = '".$username."'";

Спустя 7 минут, 21 секунда (16.04.2012 - 14:48) Pyroman написал(а):
Сейчас попробую.
Вот что пишет, когда целое число:
Запрос: UPDATE `realmoney` SET `cash` = `cash` - 5 WHERE `name` = 'Pyroman'
Полёт нормальный!
А вот, когда дробное:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '4 WHERE `name` = 'Pyroman'' at line 1

query string:
UPDATE `realmoney` SET `cash` = `cash` - 0,4 WHERE `name` = 'Pyroman'
Информация о таблице, откуда берётся цена:
http://puu.sh/pTlE
Информация о таблице, откуда она вычитается:
http://puu.sh/pTm9

Спустя 1 минута, 41 секунда (16.04.2012 - 14:50) Pyroman написал(а):
Цитата (Игорь_Vasinsky @ 16.04.2012 - 11:41)
формат поля какой в БД?

так попробуй

 $sql = "UPDATE `realmoney` SET `cash` = `cash`-'".$koplate."' WHERE `name` = '".$username."'";

Так пишет вот что:

Запрос: UPDATE `realmoney` SET `cash` = `cash`-'0,2' WHERE `name` = 'Pyroman'
Полёт нормальный!

и не вычитает.

Спустя 5 минут, 26 секунд (16.04.2012 - 14:56) Игорь_Vasinsky написал(а):
 $sql = "UPDATE `realmoney` SET `cash` = `cash`-'".(float)strtr(array(','=>'.'), $koplate)."' WHERE `name` = '".$username."'";


так?

Спустя 3 минуты, 3 секунды (16.04.2012 - 14:59) Pyroman написал(а):
Так при выборе любого товара:
Запрос: UPDATE `realmoney` SET `cash` = `cash`-'0' WHERE `name` = 'Pyroman'
Полёт нормальный!
То есть, цена почему то 0 становится.

Спустя 6 минут, 54 секунды (16.04.2012 - 15:06) Игорь_Vasinsky написал(а):
$sql = "UPDATE `realmoney` SET `cash` = `cash`-".(float)strtr(array(','=>'.'), $koplate)." WHERE `name` = '".$username."'";

Спустя 1 минута, 8 секунд (16.04.2012 - 15:07) Pyroman написал(а):
Всё равно, только без ' '.
Запрос: UPDATE `realmoney` SET `cash` = `cash`-0 WHERE `name` = 'Pyroman'
Полёт нормальный!

Спустя 1 минута, 3 секунды (16.04.2012 - 15:08) Игорь_Vasinsky написал(а):
боже мой.... убери (float)

Спустя 3 минуты, 39 секунд (16.04.2012 - 15:11) Pyroman написал(а):
Итог:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `name` = 'Pyroman'' at line 1

query string:
UPDATE `realmoney` SET `cash` = `cash`- WHERE `name` = 'Pyroman'
Вообще пусто.

Спустя 1 минута, 52 секунды (16.04.2012 - 15:13) Игорь_Vasinsky написал(а):
:lol: а то что я на бегу аргументы в strtr() перепутал....

по новой

 $sql = "UPDATE `realmoney` SET `cash` = `cash`-".(float)strtr($koplate, array(','=>'.'))." WHERE `name` = '".$username."'";

Спустя 2 минуты, 16 секунд (16.04.2012 - 15:16) Pyroman написал(а):
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 WHERE `name` = 'Pyroman'' at line 1

query string:
UPDATE `realmoney` SET `cash` = `cash`-0,2 WHERE `name` = 'Pyroman'

Не заменяет "," на ".".

Спустя 5 минут, 55 секунд (16.04.2012 - 15:21) Игорь_Vasinsky написал(а):
ну не 0,2 ставь, пусть у тя $koplate будет выражением, определи его ранее

$koplate = 1/5;


$sql = "UPDATE `realmoney` SET `cash` = `cash`-".$koplate." WHERE `name` = '".$username."'";

Спустя 2 минуты, 35 секунд (16.04.2012 - 15:24) Pyroman написал(а):
Так же:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 WHERE `name` = 'Pyroman'' at line 1

query string:
UPDATE `realmoney` SET `cash` = `cash`-0,2 WHERE `name` = 'Pyroman'

Спустя 1 минута, 20 секунд (16.04.2012 - 15:25) Игорь_Vasinsky написал(а):
у тя в БД данные в каком виде? от которых отнимаешь. само поле какой формат?

Спустя 5 минут (16.04.2012 - 15:30) Pyroman написал(а):
Тип данных - double.
Сумма записана в виде:
0.2
1.4
и т.д.
Точно так же и там, где цена.

Спустя 2 минуты, 10 секунд (16.04.2012 - 15:33) Игорь_Vasinsky написал(а):
(float) => (double)

Спустя 1 минута, 8 секунд (16.04.2012 - 15:34) Pyroman написал(а):
Пробовал, так же.

Спустя 6 минут, 34 секунды (16.04.2012 - 15:40) Игорь_Vasinsky написал(а):
зЗзЗздаюсь....

Спустя 13 минут, 53 секунды (16.04.2012 - 15:54) rooor написал(а):
Ну если вариантов нет - будем гадать))
UPDATE `realmoney` SET `cash` = `cash` - '".($koplate)."' WHERE `name` = '".$username."'

Спустя 50 секунд (16.04.2012 - 15:55) inpost написал(а):
Он ругается на 1 файл, а мы все правим другой файл. Или человек просто с нас угорает.

Спустя 3 минуты, 52 секунды (16.04.2012 - 15:59) Pyroman написал(а):
Цитата (inpost @ 16.04.2012 - 12:55)
Он ругается на 1 файл, а мы все правим другой файл. Или человек просто с нас угорает.

Он ругается как раз на этот файл...

Спустя 1 минута, 56 секунд (16.04.2012 - 16:01) inpost написал(а):
Pyroman
Я на первой странице тебе сказал, чтобы ты цифры обрамлял в кавычки. Потом код абсолютно готовый дал. Почему я до сих пор их не вижу?

Спустя 42 секунды (16.04.2012 - 16:01) Pyroman написал(а):
Цитата (rooor @ 16.04.2012 - 12:54)
Ну если вариантов нет - будем гадать))
UPDATE `realmoney` SET `cash` = `cash` - '".($koplate)."' WHERE `name` = '".$username."'

Так тоже целые числа вычитает, а дробные с "," вместо "."...

Спустя 1 минута, 52 секунды (16.04.2012 - 16:03) Pyroman написал(а):
Цитата (inpost @ 15.04.2012 - 20:49)
"... `cash` - '".(float)(str_replace(','.'.',$koplate))."' WHERE ...

Этот способ я пробовал, не помогло...

Спустя 1 час, 47 минут, 23 секунды (16.04.2012 - 17:51) killer8080 написал(а):
Цитата (Pyroman @ 16.04.2012 - 16:03)
Этот способ я пробовал, не помогло...

потому что там ошибка, я тебе давал исправленный вариант, ты его пробовал? Только не говори что str_replace не может заменить запятую на точку laugh.gif

Спустя 3 минуты, 20 секунд (16.04.2012 - 17:54) inpost написал(а):
Pyroman
Ну и где код ошибки? Я не видел, чтобы ты на этот запрос мне зацитировал код ошибки!!!

Спустя 21 час, 16 минут, 26 секунд (17.04.2012 - 15:10) Pyroman написал(а):
Цитата (killer8080 @ 16.04.2012 - 09:24)
нужно было так
"... `cash` - ".(float)str_replace(',', '.', $koplate)." WHERE ..."

а белую страницу показывает потому, что у тебя отключен вывод ошибок в php.ini.

Я пробовал. Вот ошибка:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 WHERE `name` = 'Pyroman'' at line 1

query string:
UPDATE `realmoney` SET `cash` = `cash` - 0,2 WHERE `name` = 'Pyroman'

Ну никак заменять не хочет...

Спустя 1 минута, 48 секунд (17.04.2012 - 15:12) Pyroman написал(а):
Всё, разобрался. Спасибо всем, кто помог.
Надо было так:
"... `cash` - ".str_replace(',', '.', $koplate)." WHERE ..."

Спустя 1 час, 11 минут, 20 секунд (17.04.2012 - 16:24) killer8080 написал(а):
Цитата (Pyroman @ 17.04.2012 - 15:12)
Надо было так:
"... `cash` - "str_replace(',', '.', $koplate)." WHERE ..."

Да ну нафиг, быть такого не может. С каких это пор приведение к float возвращает строку с запятой blink.gif

Спустя 11 минут, 52 секунды (17.04.2012 - 16:35) inpost написал(а):
killer8080
Человек троллит. Ты глянь цитату: - "str
Ошибку не видишь? Конкатенации строк нет, типичная ошибка, а человек говорит, что "работает" smile.gif

Спустя 3 часа, 53 секунды (17.04.2012 - 19:36) Pyroman написал(а):
Кто сомневается - пишите в личку. Дам протестировать. И никого я не троллю...
Вот весь код:
<?php
if( ! defined( 'HACK' ) ) {
die( "Hacking attempt!" );
}
include('config.php');
$idtovara = $_POST['buy'];
$koplate = $_POST['iprice']*$_POST['count'];
$kolichestvo = $_POST['count']*$_POST['icount'];
$sql = "UPDATE `realmoney` SET `cash` = `cash` - ".str_replace(',', '.', $koplate)." WHERE `name` = '".$username."'";
$query = mysql_query($sql);
$logtext = "$date : $username купил $nazvanie в количестве $kolichestvo";
$mes = "Вы успешно купили $kolichestvo $nazvanie";
$fp = fopen('shop.txt', 'a');
fwrite($fp, $logtext);
fwrite($fp, "\n");
fclose($fp);
?>

Спустя 55 минут, 17 секунд (17.04.2012 - 20:32) inpost написал(а):
"Это сообщение отредактировал Pyroman - 17.04.2012 - 19:37". Вот после этого и заработать должно было smile.gif

Спустя 1 час, 53 минуты, 41 секунда (17.04.2012 - 22:25) Pyroman написал(а):
Да, да. Неправильно написал, извиняюсь smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.