2017-08-10 1 views
1

Ich habe eine Funktion geschrieben, die insert.php in der Datei ist und sieht wie folgt aus:Interner Serverfehler in PDO-Statement?

<?php 
function makeInsert($query, $paramArray){ 
    include 'db.php'; 

    try { 
     $pdo = new PDO("mysql:host=localhost;dbname=$db_name", $db_user, $db_pass); 

      $stmt = $pdo->prepare($query); 
      foreach($paramArray as $k => $v){ 
       $currParamPlc = $paramArray[$k]; 
       $currParamVal = $v; 
       //bind it 
       $stmt->bindParam('{$currParamPlc}', '{$currParamVal}', PDO::PARAM_STR); 
      } 

      $stmt->execute(); 

      return "Success"; 
    } catch (PDOException $e) { 
     $error = "Error!: " . $e->getMessage() . "<br/>"; 

     return $error; 
     die(); 
    } 
} 
?> 

ich die Funktion aus einer anderen PHP-Datei aufrufen (run.php) mit diesem Code:

<?php 
    include "./insert.php"; 

    function run(){ 
     $registration = "success"; 
     $ammountInput= "12.34"; 
     $kanalInput= "2"; 
     $datumInput = "08.2017"; 
     //[0] => Monat, [1] => Jahr 
     $datumArray = explode(".", $datumInput); 

     if ($registration == "success"){ 
      $response_array['status'] = 'success'; 
      $indexnameYear  = ":year"; 
      $indexnameMonth  = ":month"; 
      $indexnameAmount = ":amount"; 
      $indexnameChannel = ":channel"; 

      $parameter = array($indexnameYear => $datumArray[1], $indexnameMonth => $datumArray[0], $indexnameAmount => $ammountInput, $indexnameChannel => $kanalInput); 

      $insertIncomeQuery = "INSERT INTO `income`(`id`, `year`, `month`, `amount`, `channel`) VALUES (NULL, " . $indexnameYear . ", ". $indexnameMonth .", ". $indexnameAmount .", ". $indexnameChannel .")"; 
      $returnValue = makeInsert($insertIncomeQuery, $parameter); 

      if($returnValue === "Success"){ 
       echo "All done."; 
      }else if (strpos($returnValue, "Error!") !== false){ 
       echo "Sorry!:" . $returnValue; 
      } 

     }else{ 
      echo "something happened"; 

     } 
    } 

?> 

Wenn ich rufe Die run() Funktion in meiner index.php Datei passiert nichts. Ich sehe nur den Fehler in den Entwickler-Tool in Google Chrome:

/insert.php Ressource konnte nicht geladen werden: Der Server mit dem Status 500 (Internal Server Error) reagierte

Gibt es eine Fehler in meiner makeInsert() Funktion, die ich nicht sehe? Oder warum bekomme ich diesen Fehler, wenn ich versuche, die Funktion run() auszuführen?

+0

die _actual_ Fehlermeldung zu sehen, überprüfen Sie Ihre Server-Fehlerprotokoll. Sie können auch ändern, wie PHP Fehler anzeigt und ihm alle Fehler direkt auf dem Bildschirm anzeigen lassen (dies ist jedoch nicht in der Produktion erwünscht, da es sensible Daten anzeigen kann, aber während der Entwicklung sollten Sie). So zeigen Sie alle Fehler und Warnungen an: https://stackoverflow.com/questions/5438060/showing-all-errors-and-warnings –

+1

''{$ currParamPlc}'' wird die Variable nicht erweitern, sie wird einfach übergeben die genaue Zeichenfolge durch.Verwenden Sie einfach $ stmt-> bindParam ($ currParamPlc, $ currParamVal, PDO :: PARAM_STR); ' – aynber

+0

@aynber Ich habe es geändert und jetzt' 'makeInsert()' gibt mir 'Erfolg' zurück, aber in der Tabelle wird kein Datensatz eingefügt . Zumindest die 500 ist weg, aber es ist wirklich seltsam, dass nichts in der Datenbank passiert. Irgendeine Idee, wie ich das Problem finden könnte? – Fabian

Antwort

2

Es gibt drei Probleme mit Ihrem Code.

  • Als @aynber said, '{$currParamPlc}' wird die Variable nicht erweitern, es wird nur passieren, dass die exakte Zeichenfolge durch. Verwenden Sie einfach $stmt->bindParam($currParamPlc, $currParamVal, PDO::PARAM_STR);

  • In ->bindParam(...); Anweisung versuchen Sie, den Wert, nicht die Referenz, an das Anweisungsobjekt zu binden. bindParam erfordert eine Referenz.

  • Sehen Sie diese Aussage hier innerhalb foreach Schleife,

    $currParamPlc = $paramArray[$k]; 
           ^^^^^^^^^^^^^^^ 
    

    Sie den Wert aus dem Feld nehmen, anstatt Sie die Referenz des Schlüssels nehmen sollten die Parameter in geeigneter Weise zu binden.

Also, wenn Sie alle drei Punkte oben kombinieren können, müssen Sie nicht diese zusätzlichen $currParamPlc und $currParamVal Variablen überhaupt benötigen, einfach Ihre ändern try{...}catch{...} Block auf folgende Weise:

try { 
    $pdo = new PDO("mysql:host=localhost;dbname=$db_name", $db_user, $db_pass); 
    $stmt = $pdo->prepare($query); 
    foreach($paramArray as $k => &$v){ 
     $stmt->bindParam($k, $v, PDO::PARAM_STR); 
    } 
    $stmt->execute(); 

    return "Success"; 
} catch (PDOException $e) { 
    $error = "Error!: " . $e->getMessage() . "<br/>"; 

    return $error; 
    die(); 
} 

Alternative Lösung:

Da Sie bereits ein Array von Einfügewerten (benannte Parameter) an senden makeInsert Funktion, können Sie diese $paramArray Array direkt an ->execute() Methode übergeben. Also Ihr try{...}catch{...} Block würde so aussehen:

try { 
    $pdo = new PDO("mysql:host=localhost;dbname=$db_name", $db_user, $db_pass); 
    $stmt = $pdo->prepare($query); 
    $stmt->execute($paramArray); 

    return "Success"; 
} catch (PDOException $e) { 
    $error = "Error!: " . $e->getMessage() . "<br/>"; 

    return $error; 
    die(); 
} 
+0

Das ist ziemlich gut und funktioniert auch! Danke für den Hinweis mit der foreach-Schleife. – Fabian