2016-05-19 6 views
0

Ich habe folgenden Code mit grundlegenden Prüfbedingungen, der verwendet wird, um Daten mit mysql und php zu filtern.Kann versuchen, Anweisungen zu fangen, die innerhalb der benutzerdefinierten PHP-Funktion geschrieben werden.

Ich habe zwei Verfahren genannt proc_report und proc_report_filtered ein, die alle Daten und eine, die Daten von und zu den Filtern basierend auf anzeigt wird in Form eingestellt. (submit_filter ist Name Button einreichen, von und zu sind zwei Eingabefelder in der Form.)

Bisher war die Verwendung im Code zu arbeiten und alle Daten anzuzeigen, wenn try und catch-Anweisungen geschrieben werden, an Ort und Stelle von display_default_data(); in anderen Abschnitten. Aber um den Code zu verkürzen, habe ich die Funktion display_default_data() benutzt, um das gleiche Stück Code immer wieder neu schreiben zu müssen. Aber überraschenderweise sehe ich keine Ergebnisse, wenn ich diesen Code ausführe.

<?php 
    function display_default_data() 
    { 
     try { 
      $records = $db->query("call proc_report"); 
      $records->setFetchMode(PDO::FETCH_ASSOC); 
     } catch (PDOException $e) { 
      die("Some problem getting data from database !!!" . $e->getMessage()); 
     } 
    } 

    if (isset($_POST['submit_filter'])) { 
     if (isset($_POST['from'], $_POST['to'])) { 
      if (!empty($_POST['from']) && !empty($_POST['to'])) { 
       try { 
        $from = $_POST['from']; 
        $to = $_POST['to']; 
        $records = $db->prepare("CALL proc_report_filtered(?,?)"); 
        $records->execute(array($from, $to)); 
       } catch (PDOException $e) { 
        die("Some problem getting data from database !!!" . $e->getMessage()); 
       } 
      } else { 
       echo "Enter some values before pressing Filter button !"; 
       display_default_data(); 
      } 
     } else { 
      echo "Please set values "; 
      display_default_data(); 
     } 
    } else { 
     display_default_data(); 
    } 
?> 

Ist dies die Schreibweise Funktionen zu verwenden und versuchen, Anweisungen in PHP zu fangen? Bitte schlage mir vor, wenn ich irgendwo falsch liege.

Auch ich fühle den Code ist ziemlich lang? Irgendwelche besseren Vorschläge, um es zu verkürzen?

Antwort

1

Kann versuchen und abfangen Aussagen in Benutzer definierte PHP-Funktion geschrieben werden?

Ja.

Ist dies die Schreibweise Funktionen zu verwenden und versuchen, Anweisungen in PHP zu fangen?

NR. You should never catch an error exception to report it. Lassen Sie PDOExceptions einfach alleine.

Auch ich fühle mich der Code ist ziemlich lang?

Schrecklich lang. Der gesamte Code Sie brauchen, ist nur

<?php 
if (!empty($_POST['from']) && !empty($_POST['to'])) { 
    $records = $db->prepare("CALL proc_report_filtered(?,?)"); 
    $records->execute(array($_POST['from'], $_POST['to'])); 
} else { 
    $records = $db->query("call proc_report"); 
} 
// here you can start displaying your records. 
+0

Es sieht kompakt aus, aber wir vermissen nicht, um zu überprüfen, ob die Variablen isset sind und die Übergabeschaltfläche gedrückt wird (isset submit_filter in meinem Fall) –

+0

Nein, wir sind nicht. Nennen Sie einen einzelnen Grund, warum wir diese Überprüfungen benötigen. –

+0

Ich habe isset mit submit_filter verwendet, um zu überprüfen, ob die Schaltfläche angeklickt ist. Da wir den Code nur ausführen müssen, wenn auf die Schaltfläche geklickt wird. Außerdem wird überprüft, ob Werte von from und to gesetzt sind oder nicht. Der Code, den Sie perfekt vorgeschlagen haben, aber ich würde gerne wissen, warum isset nicht verwendet wird. In Tutorials habe ich Leute gesehen, die es benutzen und gute Praxis sagen, um beide zu benutzen und nicht leer. Kannst du bitte die Wichtigkeit von isset erklären? Auch eine letzte Frage. Sie haben auch übersprungen ($ records-> setFetchMode (PDO :: FETCH_ASSOC);) muss nicht immer den fetchmode angeben? –

0

Dies hat nichts mit try/catch zu tun. Das Problem besteht darin, dass Sie in Ihrer Funktion außerhalb ihres Gültigkeitsbereichs auf $records zugreifen.

Da Sie nur darauf geschrieben werden wie auch immer, Sie können nur Rückkehr der Wert und weisen Sie an den Aufrufer Seite für Ihre Variable:

function display_default_data() 
{ 
    try { 
     $records = $db->query("call proc_report"); 
     $records->setFetchMode(PDO::FETCH_ASSOC); 
     return $records; 
    } catch (PDOException $e) { 
     die("Some problem getting data from database !!!" . $e->getMessage()); 
    } 
} 

/* ... */ 

$records = display_default_data(); // instead of just display_default_data(); 

Beachten Sie, dass die $recordsinnerhalb von display_default_data und die $recordsaußerhalb sind zwei verschiedene Variablen, die zufällig denselben (lokalen) Namen haben.

+0

ich versucht habe $ Aufzeichnungen in display_default_data Rückkehr() und das Sammeln sie in $ Aufzeichnungen außerhalb, wie Sie vorgeschlagen haben. Aber trotzdem funktioniert der Code nicht. –

+0

Was genau funktioniert nicht?Versuchen Sie '' '' 'mit einer Nachricht an verschiedenen Stellen zu setzen, möglicherweise mit einem 'var_dump' einer Variablen, bevor Sie Ihren Code debuggen und sehen, wo der Code einen unbeabsichtigten Pfad nimmt. – CherryDT