2016-07-23 5 views
-4

Es ist eine einfache Crud-Anwendung mit schlankem Framework Ich benutze MySQL-Datenbank ... schlanke Version ist 2.6.2. Mysql Version ist 5.7.8Wie erhalten Sie Post Request-Daten mit Slim?

Bild von Postbote:

enter image description here

// Adds a customer 
function addCustomer() { 
    //$request = Slim::getInstance()->request(); 
    $request = \Slim\Slim::getInstance()->request(); 
    $cus = json_decode($request->getBody()); 

    $sql = "INSERT INTO customers (Username,First_Name,Last_Name,Email,Phone,Password,Type,Status) VALUES (:username, :firstname, :lastname, :email, :phone, :password, :type, :status)"; 
    try { 
     $db = DB_Connection(); 
     $stmt = $db->prepare($sql); 

     $stmt->bindParam("username", $cus->Username); 
     $stmt->bindParam("firstname", $cus->First_Name); 
     $stmt->bindParam("lastname", $cus->Last_Name); 
     $stmt->bindParam("email", $cus->Email); 
     $stmt->bindParam("phone", $cus->Phone); 
     $stmt->bindParam("password", $cus->Password); 
     $stmt->bindParam("type", $cus->Type); 
     $stmt->bindParam("status", $cus->Status); 
     $stmt->execute(); 
     $cus->id = $db->lastInsertId(); 
     $db = null; 
     echo json_encode($cus); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

enter image description here

Get request is working fine

Get-Anfrage funktioniert gut:

+0

Wahrscheinlich leer ein $ Kun-> Benutzername sind vorbei Sie. – msantos

+0

yep ich denke auch, dass – arnoldssss

+0

Nach '$ cus = json_decode ($ request-> getBody());' können Sie bitte die Ausgabe 'var_dump ($ cus)' –

Antwort

1

glaube ich, was Sie 'Re fehlt ist der Doppelpunkt vor dem Parameter für die Bind-Anweisungen. Sie sollten korrigieren:

$stmt->bindParam(":username", $cus->Username); 
$stmt->bindParam(":firstname", $cus->First_Name); 
$stmt->bindParam(":lastname", $cus->Last_Name); 
$stmt->bindParam(":email", $cus->Email); 
$stmt->bindParam(":phone", $cus->Phone); 
$stmt->bindParam(":password", $cus->Password); 
$stmt->bindParam(":type", $cus->Type); 
$stmt->bindParam(":status", $cus->Status); 

EDIT

Eigentlich jetzt, dass ich einen tieferen Blick nahm, sind Sie die params mit Klein ersten Buchstaben vorbei (am Postman Screenshot einen Blick darauf werfen, verwendet man Benutzername , aber in Ihrem Code versuchen Sie, den Benutzernamen zuzuweisen. legt einen aktivierte "Benutzername" Just als Postfeld Postbote, oder ersetzen, wie folgt:

$stmt->bindParam(":username", $cus->username); 
$stmt->bindParam(":firstname", $cus->firstname); 
$stmt->bindParam(":lastname", $cus->lastname); 
$stmt->bindParam(":email", $cus->email); 
$stmt->bindParam(":phone", $cus->phone); 
$stmt->bindParam(":password", $cus->password); 
$stmt->bindParam(":type", $cus->type); 
$stmt->bindParam(":status", $cus->status); 

EDIT II

ersetzt alle Bindung mit der folgenden Schleife:

foreach($request->params() as $key => $val) { 
    $stmt->bindParam($key, $val); 
} 
+1

Der Treiber Auto fügt den Doppelpunkt hinzu, wenn nicht vorhanden. – chris85

+0

Ich ersetze Ihre Bind-Anweisungen, aber immer noch habe ich den gleichen Fehler – arnoldssss

+1

Das liegt daran, dass der Treiber das ':' automatisch hinzufügt. Diese Antwort fügt nichts hinzu. https://github.com/php/php-src/blob/PHP-5.3.24/ext/pdo/pdo_stmt.c#L363 (obwohl für zukünftige Kompatibilität sollten Sie das ':' haben, ist diese Funktion nicht in das Handbuch) – chris85

1

I Denken Sie daran, dass $ cus-> Benutzername, den Sie einfügen möchten, leer ist. Versuchen Sie $ stmt-> bindValue anstelle von $ stmt-> bindParam zu verwenden.

+0

Ok lassen Sie mich versuchen, dass – arnoldssss

+0

ich ein bekanntes Fehler wie das vorherige bekommen: Typ: Error Code: 8 Nachricht: Der Versuch, zu erhalten Eigenschaft des Nicht-Objekts – arnoldssss

+0

Haben Sie den Benutzernamen Wert gedruckt? – msantos

1

Dies sieht aus wie ein Problem mit der Groß-/Kleinschreibung. Sie binden Parameter aus dem Formular, die versuchen, sie anhand der Spaltennamen ihrer Gegenstückdatenbank zu referenzieren. Dein Postman-Screenshot zeigt, dass die Namen der Eingaben in Kleinbuchstaben geschrieben sind.

Versuchen

$stmt->bindParam("username", $cus->username); 
    $stmt->bindParam("firstname", $cus->firstname); 
    $stmt->bindParam("lastname", $cus->lastname); 
    $stmt->bindParam("email", $cus->email); 
    $stmt->bindParam("phone", $cus->phone); 
    $stmt->bindParam("password", $cus->password); 
    $stmt->bindParam("type", $cus->type); 
    $stmt->bindParam("status", $cus->status); 
+0

Ok .. machen die Anfrage wie zuvor mit Postman und mit Ihrem Code gibt mir immer noch den gleichen Fehler .. {"Fehler": {"Text": SQLSTATE [23000]: Integrität Einschränkung Verletzung: 1048 Spalte 'Benutzername' kann nicht null sein }} Vielen Dank.. – arnoldssss

Verwandte Themen