tweede functie wordt niet uitgevoerd

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Donald Boers

Donald Boers

12/06/2018 21:26:00
Quote Anchor link
Ik heb de twee volgende functies in mijn model:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));
}


In de controller heb ik het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.";                        
    }
}

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;

Ziet iemand wellicht iets dat ik over het hoofd zie?

Alvast bedankt
 
PHP hulp

PHP hulp

22/12/2024 15:36:13
 
Thomas van den Heuvel

Thomas van den Heuvel

12/06/2018 22:52:48
Quote Anchor link
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?
 
Donald Boers

Donald Boers

12/06/2018 23:16:46
Quote Anchor link
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
 
Thomas van den Heuvel

Thomas van den Heuvel

13/06/2018 00:08:25
Quote Anchor link
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
 
Rob Doemaarwat

Rob Doemaarwat

13/06/2018 00:15:08
Quote Anchor link
Staat er wel een record in comments_counter voor dat specifieke post_id?
 
Donald Boers

Donald Boers

13/06/2018 10:07:02
Quote Anchor link
@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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
}

waarbij de standaard waarde voor rij counter op 1 staat
 
Rob Doemaarwat

Rob Doemaarwat

13/06/2018 11:29:43
Quote Anchor link
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).
 
Ivo P

Ivo P

13/06/2018 13:05:55
Quote Anchor link
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
 
Rob Doemaarwat

Rob Doemaarwat

13/06/2018 13:38:59
Quote Anchor link
@Ivo: zie de CREATE TABLE:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
  `counter` int(11) NOT NULL DEFAULT '0'

Dus nooit NULL, en default in ieder geval 0. Zou dus moeten werken.
 
Thomas van den Heuvel

Thomas van den Heuvel

13/06/2018 14:58:19
Quote Anchor link
@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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$last_id    =    $this->page->last_post_id();
$new_id        =    $last_id + 1;

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 functie 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.
Gewijzigd op 13/06/2018 15:00:46 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.