tweede functie wordt niet uitgevoerd
Ik heb de twee volgende functies in mijn model:
In de controller heb ik het volgende:
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
Ziet iemand wellicht iets dat ik over het hoofd zie?
Alvast bedankt
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
Hoe is je foutafhandeling?
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?
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?
@Rob Doemaarwat. Ja die staat er. Op het moment dat eer een nieuw artike word geschreven wordt er gelijk een nieuwe rij aangemaakt in comments_counter:
waarbij de standaard waarde voor rij counter op 1 staat
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).
wat is de waarde van Counter voorafgaand aan de update query?
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
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
@Ivo: zie de CREATE TABLE:
Dus nooit NULL, en default in ieder geval 0. Zou dus moeten werken.
Dus nooit NULL, en default in ieder geval 0. Zou dus moeten werken.
@Rob, maak er UNSIGNED van, nu gooi je ca. de helft van je waardenbereik weg als je toch alleen maar gehele getallen >= 0 gebruikt. Niet dat je snel aan het maximun zit, maar toch.
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.
Defunctie methode wordt dus wél uitgevoerd. Als dit niet zou gebeuren zou je namelijk een foutmelding krijgen. Je zou query logging aan kunnen zetten, dan zie je precies wat er aan de database-zijde gebeurt. Nog een reden waarom ik geen gebruik maak van PDO, dit maakt het debuggen van (ogenschijnlijk kloppende) queries ingewikkeld.
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




