tweede functie wordt niet uitgevoerd
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function insert_comment($post_id, $name, $comment)
{
$sql = "INSERT
INTO `post_comments` (`post_id`, `name`, `comment`)
VALUES (?, ?, ?)";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute(array($post_id, $name, $comment));
}
public function register_changes($post_id)
{
$sql = "UPDATE `comments_counter`
SET `counter` = `counter` + 1
WHERE `post_id` = ?";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute(array($post_id));
}
{
$sql = "INSERT
INTO `post_comments` (`post_id`, `name`, `comment`)
VALUES (?, ?, ?)";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute(array($post_id, $name, $comment));
}
public function register_changes($post_id)
{
$sql = "UPDATE `comments_counter`
SET `counter` = `counter` + 1
WHERE `post_id` = ?";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute(array($post_id));
}
In de controller heb ik het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$post_id = filter_input(INPUT_POST, 'post_id', FILTER_SANITIZE_NUMBER_INT);
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$comment = filter_input(INPUT_POST, 'comment', FILTER_SANITIZE_STRING);
if($this->blog->insert_comment($post_id, $name, $comment))
{
if($this->blog->register_changes($post_id))
{
http_response_code(200);
echo 'Thank you. Your comment was succesfully added!';
}
else
{
http_response_code(500);
echo "Something went wrong with submitting your respond.";
}
}
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$comment = filter_input(INPUT_POST, 'comment', FILTER_SANITIZE_STRING);
if($this->blog->insert_comment($post_id, $name, $comment))
{
if($this->blog->register_changes($post_id))
{
http_response_code(200);
echo 'Thank you. Your comment was succesfully added!';
}
else
{
http_response_code(500);
echo "Something went wrong with submitting your respond.";
}
}
Er gebeurt echter its geks. De eerste query (insert_comment) wordt goed uitgevoerd, maar de tweede (register_changes) dus niet. Het gekke is echter dat ik in het formulier wel het succes bericht krijg. Tevens als ik de register_changes query handmatig uitvoer in PHPAdmin werkt het wel. Voor de goede orde is dit de structuur van de tafel comments_counter
Code (php)
1
2
3
4
5
6
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `comments_counter` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`post_id` int(11) NOT NULL,
`counter` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
`id` int(11) NOT NULL AUTO_INCREMENT,
`post_id` int(11) NOT NULL,
`counter` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Ziet iemand wellicht iets dat ik over het hoofd zie?
Alvast bedankt
Staat alles in een try-catch blok?
Worden ergens fouten weergegeven?
Gebruik je buffered of unbuffered queries? (voor de laatste variant is het misschien nodig om statements af te sluiten?)
Heb je al geprobeerd echo's/breekpunten/logging in je code te zetten/op te nemen zodat je zeker weet dat je code de query bereikt?
Je bent er namelijk van overtuigd dat er iets gebeurt (en iets niet gebeurt), terwijl je niet weet wat er misgaat. Tijd om even zonder aannames precies te analyseren wat er precies gebeurt. En daarna zoek je uit waarom.
Los daarvan, waarom sla je het #reacties niet op in de blogpost-tabel, scheelt je later waarschijnlijk een query, een aparte tabel voor comments_counter is een beetje overkill?
Thomas van den Heuvel op 12/06/2018 22:52:48:
Los daarvan, waarom sla je het #reacties niet op in de blogpost-tabel, scheelt je later waarschijnlijk een query, een aparte tabel voor comments_counter is een beetje overkill?
Ben nu aan het kijken waar het eventueel fout gaat.
Wat betreft je laatste opmerking. Hier heb ik ook aan zitten denken, het is echter zo dat de eigenaar, gezien de vele span die er op blogs etc voorkomt, bepaalde reacties ook kan verwijderen. Het aantal van counter word gebruikt voor de polling
Donald Boers op 12/06/2018 23:16:46:
Hier heb ik ook aan zitten denken, het is echter zo dat de eigenaar, gezien de vele span die er op blogs etc voorkomt, bepaalde reacties ook kan verwijderen.
Het aantal updaten moet toch ergens gebeuren. Beter in een kolom dan in een aparte tabel wellicht. Of je telt gewoon het aantal comments in de query met een COUNT, hoef je helemaal niets op te slaan.
Gewijzigd op 13/06/2018 00:08:52 door Thomas van den Heuvel
Staat er wel een record in comments_counter voor dat specifieke post_id?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
$last_id = $this->page->last_post_id();
$new_id = $last_id + 1;
if($this->page->add_blog_post($post_title, $post_sub_title, $post_author, $post_content, $file_name))
{
$this->page->insert_counter($new_id);
}
$new_id = $last_id + 1;
if($this->page->add_blog_post($post_title, $post_sub_title, $post_author, $post_content, $file_name))
{
$this->page->insert_counter($new_id);
}
waarbij de standaard waarde voor rij counter op 1 staat
Tsja, toch maar eens wat debug info vanuit die function register_changes($post_id) echo-en ... ($sql, $post_id, `counter` voor en na de UPDATE).
Is dat 0 of is het NULL?
NULL + 1 zou best wel eens NULL kunnen zijn.
In dat geval wordt je query dus wel uitgevoerd, maar levert dat niet het verwachte resultaat.
Geeft counter een default value 0, of regel dat in de insert query
Dus nooit NULL, en default in ieder geval 0. Zou dus moeten werken.
Enne, het is een InnoDB database, dus waarom bestat er geen FOREIGN KEY naar de blog_posts tabel? :/
Ook zou dit in een transactie moeten staan, dus in zekere zin zou je beide queries in één methode kunnen / moeten zetten. Het toevoegen van een reactie en het opgehoogde aantal reacties -deze bewerkingen- zouden namelijk als één ondeelbare actie moeten plaatsvinden.
Volgens mij klopt dit niet:
Daar zijn AUTO INCREMENT velden niet voor bedoeld... Ga je hier niet gewoon de mist in?
Dit zou ook meteen verklaren waarom je query niet werkt: deze is syntactisch correct, maar heeft semantisch geen betekenis, oftewel, je probeert waarschijnlijk het aantal comments van een niet-bestaande post (of een *andere* post dan je wellicht zou verwachten) op te hogen. Dit is uit SQL-optiek niet fout, het heeft alleen geen, of een ongewenst, effect.
De
Gewijzigd op 13/06/2018 15:00:46 door Thomas van den Heuvel