You have an error in your SQL syntax

dunix

Registered
Проверих и променях кода на няколко пъти, но така и не успях да махна или открия къде ми е грешката.

PHP:
$query = $DB->query("INSERT INTO conversation ('mid1', 'mid2', 'ip', 'timeposted') VALUES ('" . $mid1 . "', '" . $mid2 . "', '" . $ip . "', '" . time() . "')") or die(mysql_error());

и така пробвах

PHP:
$query = $DB->query("INSERT INTO conversation ('mid1', 'mid2', 'ip', 'timeposted') VALUES ('$mid1', '$mid2', '$ip', '". time() . "')") or die(mysql_error());

Изписва ми

Код:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''mid1', 'mid2', 'ip', 'timeposted') VALUES ('1', 'test', 'myip', '13802' at line 1

Когато го направя така:

PHP:
$query = $DB->query("INSERT INTO conversation (mid1, mid2, ip, timeposted) VALUES ('$mid1', '$mid2', '$ip', '$time')") or die(mysql_error());

ми изписва грешка

Код:
Cannot add or update a child row: a foreign key constraint fails (`test`.`conversation`, CONSTRAINT `conversation_ibfk_2` FOREIGN KEY (`mid2`) REFERENCES `members` (`member_id`))
 
Имената на колоните никога не ги слагай в обикновени кавички (" или ') - винаги ще даде грешка.
Което доста смалява обема на поста ти :)
А за третия опит - вижда ми се доста странно, защото заявката изглежда съвсем наред. Има нулев шанс да стане като заобиколиш имената на колоните с третия вид кавички:
``
Все пак нищо не пречи да пробваш. Така че проблема е най вероятно в самата база данни, а не в заявката.

Още едно предложение с нулев шанс - пробва ли да го направиш през конзолата?
 
Ако нямаш нужда, махни FOREIGH KEY-овете на таблиците и няма да имаш грешка. А грешката е, че се опитваш да добавиш запис с несъществуващо ID от таблицата users.
 
anonimen каза:
Имената на колоните никога не ги слагай в обикновени кавички (" или ') - винаги ще даде грешка.
Благодаря за съвета.

anonimen каза:
А за третия опит - вижда ми се доста странно, защото заявката изглежда съвсем наред. Има нулев шанс да стане като заобиколиш имената на колоните с третия вид кавички:
``

Пробвах преди, но и сега пак пробвах и резултата е:

Код:
Cannot add or update a child row: a foreign key constraint fails (`test`.`conversation`, CONSTRAINT `conversation_ibfk_2` FOREIGN KEY (`mid2`) REFERENCES `members` (`member_id`))


anonimen каза:
Все пак нищо не пречи да пробваш. Така че проблема е най вероятно в самата база данни, а не в заявката.

Още едно предложение с нулев шанс - пробва ли да го направиш през конзолата?

Като го задавам през phpmyadmin си протича нормално
Ето така като го направя:
[sql]INSERT INTO conversation (`mid1`, `mid2`, `ip`, `timeposted`) VALUES ('1', '41', '13', '414324')[/sql]

Replace каза:
Ако нямаш нужда, махни FOREIGH KEY-овете на таблиците и няма да имаш грешка. А грешката е, че се опитваш да добавиш запис с несъществуващо ID от таблицата users.

Всъщност тези FOREIGH KEY до колкото разбрах вземат ID-то (в моя случай) на потребителя от таблицата която съм посочил. А относно грешка според мен е неправилна, защото съществува такова ID иначе не мога да видя профила.

ПС: забравих да отбележа, че ми го показва само там където вече съществува поле с тези данни (mid1 и mid2 да съвпадат) + моя профил.
 
Изкарай просто структурата на таблицата, и дай да видим какво прави FOREIGHT KEY-я в случая.
 
щом ти дава тая грешка на mid1 и mid2 може би тези полета са с уникални ключове или някакви други ключове, при което връща грешка
 
SQL ми е:

[sql]
CREATE TABLE IF NOT EXISTS `members` (
`member_id` int(9) unsigned NOT NULL AUTO_INCREMENT,
`group_id` smallint(4) unsigned NOT NULL DEFAULT '0',
`username` varchar(32) NOT NULL DEFAULT '',
`password` varchar(32) NOT NULL DEFAULT '',
`email` varchar(64) NOT NULL DEFAULT '',
`joindate` int(10) unsigned NOT NULL DEFAULT '0',
`lastvisit` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`member_id`),
KEY `group_id` (`group_id`),
KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `conversation` (
`c_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`mid1` int(11) unsigned NOT NULL,
`mid2` int(11) unsigned NOT NULL,
`ip` varchar(30) CHARACTER SET latin1 DEFAULT NULL,
`timeposted` int(11) DEFAULT NULL,
PRIMARY KEY (`c_id`),
KEY `mid1` (`mid1`),
KEY `mid2` (`mid2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `conversation`
ADD CONSTRAINT `conversation_ibfk_1` FOREIGN KEY (`mid1`) REFERENCES `members` (`member_id`),
ADD CONSTRAINT `conversation_ibfk_2` FOREIGN KEY (`mid2`) REFERENCES `members` (`member_id`);
[/sql]

PHP:
function messages($idc) {
	$mid1 = $SESSION->conf['member_id'];
	$mid2 = $idc;
	$ip = $_SERVER['REMOTE_ADDR'];
	$time = time();

	if($mid1 != $mid2) {
		$result = $DB->query("SELECT c_id FROM conversation WHERE (mid1='$mid1' AND mid2='$mid2') OR (mid1='$mid2' AND mid2='$mid1') ");
		if($DB->num_rows($result)==1) 
		{
			$row = $DB->fetch_array($result);
		}
		else
		{
			$query = $DB->query("INSERT INTO conversation (`mid1`, `mid2`, `ip`, `timeposted`) VALUES ('$mid1', '$mid2', '$ip', '$time')") or die(mysql_error());
			$result = $DB->query("SELECT c_id FROM conversation WHERE mid1='$mid1' AND mid2='$mid2' ORDER BY c_id DESC LIMIT 1");
			$row = $DB->fetch_array($result);
		}
		return $PREFS->conf['fancy_urls'] ? "account/conversation/view/" . $row['c_id'] . "/" . $idc . "/" : "index.php?m=account_conversation&p=view&cid=" . $row['c_id'] . "&id=" . $idc . "";
	}


}

Там където има mysql_error е реда с грешката
 
Не знам дали знаеш, но полетата трябва да бъдат идентични.
Т.е. member_id трябва да е също unsigned NOT NULL :idea:
Аз обаче все още не разбирам защо ти е FOREIGH KEY на тези таблици?
 
Replace каза:
Не знам дали знаеш, но полетата трябва да бъдат идентични.
Т.е. member_id трябва да е също unsigned NOT NULL :idea:

Проверих и са идентични (ПС:редактирах си горния пост и сложих таблицата на members)

Replace каза:
Аз обаче все още не разбирам защо ти е FOREIGH KEY на тези таблици?

за да не взема несъществуващи ID-та
 
Явно аз съм проспал нещо, но както и да е.
[sql]INSERT INTO conversation (`mid1`, `mid2`, `ip`, `timeposted`) VALUES ('1', '41', '13', '414324')[/sql]
Сигурен ли си, че имаш members.member_id = 41 ?
 
Replace каза:
[sql]INSERT INTO conversation (`mid1`, `mid2`, `ip`, `timeposted`) VALUES ('1', '41', '13', '414324')[/sql]
Сигурен ли си, че имаш members.member_id = 41 ?

Да, аз съм id 1, а тестовия ми потребител е с id 41
 
Няма причина да не работи, ако двете ID-та съществуват.
С твоя CREATE TABLE създадох таблици, с примерни данни и си работи (стига както казахме, да са реални съществуващи записи).
Да не би да имаш някакви несъществуващи записи. Само за теста, може да си бекъпниш двете таблици и да ги TRUNCATE-неш, и така да пробваш.
 
Replace каза:
Няма причина да не работи, ако двете ID-та съществуват.
С твоя CREATE TABLE създадох таблици, с примерни данни и си работи (стига както казахме, да са реални съществуващи записи).
Да не би да имаш някакви несъществуващи записи. Само за теста, може да си бекъпниш двете таблици и да ги TRUNCATE-неш, и така да пробваш.

Изчистих таблицата conversation и пак ми дава същата грешка.

Забелязвам, че при отваряне на профила от site.com/username ми дава тази грешка, но когато го отворя чрез ID нямам този проблем (index.php?m=member_profile&p=profile&id=member_id)

Също така забелязвам, че кода ми не е наред, защото още като се пробвам да влезна в профила се пробва да ми създаде разговор м/у двамата потребителя, което не трябва да се случва.
 
Проблемът му е че $mid2 получава символен низ, а не цифра (int) както е задал в базата. Там трябва да се подава ИД-то на получателя :)
 
След проверки и support от страна на dakata_92 се установи че променливата $mid2 не взема int, а го превръща в str. По ясно вместо да ми изкара ID на потребителя ми изкарва USERNAME-а. От там идва цялата грешка.

Благодаря на всички отзовали се!
 

Back
Горе