2016-07-24 10 views
0

PHP-Version: 7.0Warum wird dieses SQL nicht in die Datenbank eingefügt?

Skript wird Daten von einer anderen Website gesendet.

Aus irgendeinem Grund werden die Daten nicht so in die Datenbank eingefügt, wie es sein sollte, und ich glaube nicht, dass ich irgendwelche SQL-Fehler habe (dies wird mit PDO gemacht).

Hier ist die enthaltenen Funktionen Code:

<?php 
function escape($string){ 
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); 
} 
?> 

Script-Code:

<html> 
<head> 
    <title>Data from Roblox</title> 
    <h3>Data from Roblox</h3> 
</head> 
<body> 
<?php 
    include '../includes/connection.php'; 
    include '../scripts/functions.php'; //Remove if unknown error as well as the escapes 
    error_reporting(E_ALL); 
    ini_set('display_errors', 1); 
    $array = json_decode(file_get_contents('php://input'),1); 
    $SenderName = escape($array['SenderName']); 
    $SenderID = escape($array['SenderID']); 
    $PlayerName = escape($array['PlayerName']); 
    $PlayerID = escape($array['PlayerID']); 
    $Reason = escape($array['Reason']); 
    $PlaceLink = escape($array['PlaceLink']); 
    if(!$Reason){ $Reason = "Reason not provided."; } 


    if($SenderName !=NULL and $SenderID != NULL and $PlayerName != NULL and $PlayerID !=NULL and $PlaceLink !=NULL){ 
     $query = $handler->prepare("INSERT INTO PlayerBans (`ID`, `Username`,`Reason`, `BannedDate`, `BannedBy`, `BannedAt`) VALUES (:pid, :pname, :reason, NOW(), :sname, :pl)"); 
     $query->bindParam(':pid', $PlayerID); 
     $query->bindParam(':pname', $PlayerName); 
     $query->bindParam(':reason', $Reason); 
     $sender = $SenderName . " - " . $SenderID; 
     $query->bindParam(':sname', $sender); 
     $query->bindParam(':pl', $PlaceLink); 
     $query->execute(); 

    } 
?> 
</body> 
</html> 

Wenn in meinem Web-Browser auf die Skript-URL gehen, die HTML erscheint und keine Fehler.

+0

ohne Bezug ... Sie überprüfen, ob '$ PlaceLink! = NULL' zweimal in Ihrem' if' direkt vor Ihrer Insert-Anweisung ... – IzzEps

+0

Vielen Dank. Ich habe das behoben. Würde dies das Problem verursachen? – Austin

+0

unwahrscheinlich ... haben Sie bestätigt, dass Ihre Datenbankverbindung ordnungsgemäß funktioniert? – IzzEps

Antwort

0

Ihr Problem ist fast sicher, dass die Anfrage eingeht, aber hier sind einige Probleme, die Sie mit Ihrem Code beheben könnten.

  • htmlspecialchars() wird nicht in eine Datenbank eingefügt. Es wird verwendet, wenn Sie etwas als HTML anzeigen möchten.
  • keiner dieser Werte, die Sie überprüfen, wird jemals Null sein, weil Sie sie durch htmlspecialchars() ausführen, die eine Zeichenfolge zurückgibt.
  • gibt es keine Notwendigkeit, PDOStatement::bindParam()10 zu verwenden, es sei denn, Sie müssen etwas besonderes mit Datentypen tun. Übergeben Sie stattdessen einfach ein Array an PDOStatement::execute().
  • Es klingt, als würden Sie keine Fehlermeldungen aufzeichnen. Wenn Sie diese Seite nicht interaktiv verwenden, müssen Sie wissen, ob es ein Problem gibt.

Mit dem im Verstand, würde ich dies empfehlen daher,:

<?php 
include("../includes/connection.php"); 
error_reporting(E_ALL); 
ini_set("display_errors", true); 
ini_set("error_log", "/var/log/php.log"); 

$json  = file_get_contents("php://input"); 
$array  = json_decode($json, true); 

$SenderName = $array['SenderName'] ?? null; 
$SenderID = $array['SenderID'] ?? null; 
$PlayerName = $array['PlayerName'] ?? null; 
$PlayerID = $array['PlayerID'] ?? null; 
$Reason  = $array['Reason'] ?? "Reason not provided"; 
$PlaceLink = $array['PlaceLink'] ?? null; 

if($SenderName !== null && $SenderID !== null && $PlayerName !== null && $PlayerID !== null && $PlaceLink !== null) { 
    // prepare using ? for a shorter query; don't mix placeholders with other values 
    $query = $handler->prepare("INSERT INTO PlayerBans (`ID`, `Username`,`Reason`, `BannedBy`, `BannedAt`, `BannedDate`) VALUES (?,?,?,?,?,NOW())"); 
    // double quotes interpolate variables! 
    $sender = "$SenderName - $SenderID"; 
    // pass the values directly to execute 
    $result = $query->execute([$PlayerID, $PlayerName, $Reason, $sender, $PlaceLink]); 
    // check the result of this call and log some details if there's a problem 
    if (!$result) { 
     $e = $query->errorInfo(); 
     error_log("SQL Error $e[0]: $e[2] ($e[1]) while inserting data: $json"); 
    } 
} 
?> 

Sie werden sicherstellen möchten, dass Sie die Protokolldatei vor der Zeit zu erstellen, mit den richtigen Berechtigungen für Ihren Webserver um dazu schreiben zu können. Auf einer Linux-Plattform könnte dies wie folgt aussehen: sudo touch /var/log/php && sudo chown www-data /var/log/php

Auch ich nehme an, dass Sie eine aktuelle Version von PHP verwenden, die die null coalesce operator unterstützt; Sie müssen $foo = $bar ?? null durch $foo = isset($bar) ? $bar : null ersetzen, wenn das nicht der Fall ist.

Noch ein Punkt, wenn jeder Benutzer auf Ihrem System einen Eintrag in einer Benutzertabelle hat, sollten Sie wirklich UserID und SenderID Spalten in der PlayerBans-Tabelle, die Fremdschlüssel sind, zurück zu Ihrer Tabelle Benutzer. Wenn Sie diese Spalte regelmäßig abfragen, ist das viel sinnvoller als eine unstrukturierte Textspalte.

Verwandte Themen