Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zapytaniem int = int +1
Forum PHP.pl > Forum > Bazy danych > MySQL
GyniO
Witam, posiadam pewną funkcję, której zadaniem jest dodawanie do pola +1 no i tutaj mam problem.

  1. Begin
  2. DECLARE pole TEXT;
  3. SET pole = 'visit';
  4. SET @s = CONCAT("UPDATE cms_users_stats SET ", pole," = (",pole," + 1) WHERE user_id = 1;");
  5. PREPARE stmt FROM @s;
  6. EXECUTE stmt;
  7. DEALLOCATE PREPARE stmt;
  8. END;


No i często jest tak, że zamiast + 1 dodaje 60, 8,5...

Co może być problemem? Osobiście uważam, że coś jest nie tak z concat,prepare,execute..
Mógłby mi ktoś napisać, czy jest inny możliwy sposób użycia zmiennej jako nazwę danego pola?

Lub jak to zrobić w inny sposób, byle z użyciem sql, jest mi to potrzebne do mojego cms'a.
adk11
CREATE TABLE `cms_users_stats` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`visit` int(11) DEFAULT '0',
`login` int(11) DEFAULT '0',
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

CREATE PROCEDURE `new_proc`( IN pole TEXT )
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SET @s = CONCAT("UPDATE cms_users_stats SET ", pole," := (",pole," + 1) WHERE user_id = 1;");
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;

mysql> select * from cms_users_stats;
+---------+-------+-------+
| user_id | visit | login |
+---------+-------+-------+
| 1 | 0 | 0 |
+---------+-------+-------+
1 row in set (0.00 sec)

mysql> call new_proc('visit');
Query OK, 0 rows affected (0.01 sec)

mysql> call new_proc('visit');
Query OK, 0 rows affected (0.00 sec)

mysql> select * from cms_users_stats;
+---------+-------+-------+
| user_id | visit | login |
+---------+-------+-------+
| 1 | 2 | 0 |
+---------+-------+-------+
1 row in set (0.00 sec)

mysql> call new_proc('login');
Query OK, 0 rows affected (0.01 sec)

mysql> select * from cms_users_stats;
+---------+-------+-------+
| user_id | visit | login |
+---------+-------+-------+
| 1 | 2 | 1 |
+---------+-------+-------+
1 row in set (0.00 sec)

mysql> call new_proc('login');
Query OK, 0 rows affected (0.00 sec)

mysql> call new_proc('login');
Query OK, 0 rows affected (0.00 sec)

mysql> call new_proc('login');
Query OK, 0 rows affected (0.00 sec)

mysql> select * from cms_users_stats;
+---------+-------+-------+
| user_id | visit | login |
+---------+-------+-------+
| 1 | 2 | 4 |
+---------+-------+-------+
1 row in set (0.00 sec)

mysql> call new_proc('loginn');
ERROR 1054 (42S22): Unknown column 'loginn' in 'field list'

po ostatnim zapytaniu widać że kolumny są wpisywane z palca. Nie zauważyłem żeby też przy okazji istniejące kolumny były źle incrementowane.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.