2009-08-13 13 views
0

Ich bin relativ neu in Cake PHP-Framework und versuchte einige Dinge darin. Ich habe eine Blog-Datenbank erstellt. Ich habe versucht, ein Array von Anzahl der Beiträge in einem bestimmten Jahr mit der debug() -Funktion zu sehen. Ich schrieb die folgende Funktion im Post-Modell.Problem mit Debug-Funktion in PHP

function findByYear($year = null){ 
     $date = $year.'-01-01 00:00:00'; 
     $end_date = $year.'-12-31 23:59:59'; 
     return $this->find('all',array('conditions'=>array('DATE(Post.date)'=>'>'.$date,'DATE(Post.date)'=>'<'.$end_date))); 

    } 

Dann habe ich eine Lese-Funktion in der posts_controller enthalten.

function read($year=null) { 
     if (!$year) { 
      $this->Session->setFlash('Please supply a year'); 
      $this->redirect(array('action'=>'index')); 
     } 
     $this->set('posts',$this->Post->findByYear($year)); 
    } 

Schließlich wird eine eine Lese View-Datei erstellt (read.ctp) und enthielt die Debug-Funktion in diesen

<?php debug($posts) ?> 

Nun, das Problem ist, dass ich ein leeres Array bin immer, wenn ich den Start Aktion in der URL: http://localhost/posts/read/2009 Ich habe bereits 3 Beiträge, aber ich bekomme keine von ihnen im Array. Was fehlt mir?

+0

Können Sie einen SQL-Dump der Tabelle hinzufügen? Vielleicht stimmen die Beiträge nicht mit Ihrer Suchanfrage überein? –

+0

Haben Sie das generierte SQL überprüft (setzen Sie debug auf 2 in app/config/core.php)? – dhofstet

+0

WÄHLEN 'Post' 'id',' Post''name', 'Post''date',' Post''content', 'Post''user_id',' User''id', "Benutzer", "Benutzer", "Benutzer", "Vorname", "Benutzer", "Nachname", "von den Stellen", AS "Post", "LINKS", "Benutzer", "Benutzer", "ON" ('Post'.user_id' =' User''id') WHERE DATUM ('Post''date') = '<2009-12-31 23:59:59' –

Antwort

1

Das Bedingungs-Array kann gemischte Typen sein (dh es kann sowohl Strings als auch Arrays enthalten). Es könnte einfacher sein, die datumsbasierten Kriterien als Zeichenfolgen auszudrücken, da Sie mit einem Bereich anstelle einer genauen Übereinstimmung am Datum arbeiten. Zum Beispiel:

$conditions = array(); 
$conditions[] = array('Post.id'=>$myId); 
$conditions[] = 'DATE(Post.date) > '.$date; 

$posts  = $this->find('all',array('conditions'=>$conditions)); 

(Ein zusätzlicher Vorteil ist, dass dies viel einfacher für Normalsterbliche zu analysieren.)

Ein weiterer Punkt - Sie sollten stattdessen Strings betrachten einfach mit der mktime() Funktion bauen Sie Ihr Datum verketten der Parameter an der Vorderseite der Saite und hofft auf das Beste. Dies würde dem doppelten Zweck dienen, eine rudimentäre Validierung des Parameters $year zu liefern und die Wahrscheinlichkeit unerwarteter Ergebnisse zu reduzieren. Zum Beispiel:

$date  = mktime(0,0,0,1,1,$year); //$year.'-01-01 00:00:00'; 
$end_date = mktime(23,59,59,12,31,$year); //$year.'-12-31 23:59:59'; 

dass beide Ihrer Datumswerte in dem Unix-Zeitstempel-Format festgelegt wird, das ist, was man so wie man will, so dass es ein Gewinn von fast jedem Winkel ist.

Viel Glück!

2

Ich denke, das Problem ist die Position der "<" und ">" Operatoren, weil sie auf der Seite "Schlüssel" sein müssen, und nicht auf der Seite "Wert". Ändern

'DATE(Post.date)' => '>'.$date 

zu

'DATE(Post.date) >' => $date 

Das gleiche gilt für die andere Bedingung gilt.