2017-04-09 1 views
-1

J'ai créé un gestionnaire PHP pour recevoir une charge JSON à partir d'une requête POST, puis l'insérer dans une base de données dans phpMyAdmin. Je ne sais pas pourquoi cela ne fonctionne pas.Pourquoi mes données json ne sont-elles pas insérées dans la base de données mySQL?

JSON:

payload = { 
    "version":"1.0", 
    "event":"video_recorded", 
    "data":{ 
     "videoName":"vs1457013120534_862", 
     "audioCodec":"NellyMoser ASAO", 
     "videoCodec":"H.264", 
     "type":"FLV", 
     "orientation":"landscape", 
     "id":"0", 
     "dateTime":"2016-03-03 15:51:44", 
     "timeZone":"Europe/Bucharest", 
     "payload":"111.111.111.11", 
     "httpReferer":"http://site_from_where_video_was_recorded.com" 
    } 
} 

Le code PHP Je suis d'un tutoriel en ligne. Le tutoriel est de 2017 donc je suppose que tout est à jour, mais pourtant il ne fonctionne toujours pas:

<?php 

/* db variables */ 

$dbhost = 'localhost'; 
$dbname = 'name_db'; 
$dbuser = 'user_db'; 
$dbpass = 'pass_db'; 

/* grab the json */ 

$data = $_POST['payload']; 

/* put json into php associative array */ 

$data_array = json_decode($data); 

/* store in PHP variables */ 

$ip_address = $data_array['data']['payload']; 
$vid_name = $data_array['data']['videoName']; 
$date_time = $data_array['data']['dateTime']; 
$time_zone = $data_array['data']['timeZone']; 

/* connect to mysql db */ 

$con = mysql_connect($dbuser, $dbpass, $dbhost) or die('Could not connect: ' . mysql_error()); 

/* select the specific db */ 

mysql_select_db($dbname, $con); 

/* insert the values into the db */ 

$sql = "INSERT INTO ip_and_videos(IpAddress, VideoName, DateTime, Timezone) VALUES('$ip_address','$vid_name','$date_time','$time_zone')"; 

if(!mysql_query($sql,$con)) 
{ 
    die('Error : ' . mysql_error()); 
} 

?> 

je la clé primaire définie sur un int et avoir sur incrémentation automatique. Si je comprends bien, je n'ai pas besoin d'insérer quoi que ce soit dans cette colonne car il va attribuer un numéro à chaque fois. Ou dois-je quand même le passer quand j'insère les autres variables?

+1

arrêt en utilisant des extensions mysql. Votre code est ouvert pour SQL Injection. – Bhavin

+0

D'accord, je vais y regarder. Une idée de pourquoi ça ne marche pas comme ça? –

+0

Non. Vous n'avez pas besoin de passer car la clé primaire est un incrément automatique. Mettez à jour votre question avec votre erreur. Et démarrez error_reporting (E_ALL) au démarrage de votre code, donc s'il y a d'autres erreurs, nous pouvons le comprendre aussi. – Bhavin

Répondre

1

Cela fonctionne pour la partie tableau, vous obtenez la bonne réponse. Donc, votre code n'est pas mauvais, mais vous devriez vérifier toutes les erreurs (comme indiqué par Bhavin dans le commentaire). Et je suis sûr que vous avez une faute de frappe -> $ vid_name = $ data_array ['data'] ['videName']; est PAS comme $ vid_name = $ data_array ['data'] ['vide o Nom']; Thereforer, error_reporting sera très utile, et après cela, vérifiez la requête si d'autres erreurs (déclarations préparées ^^)

<?php 

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

$payload = '{ 
      "version":"1.0", 
      "event":"video_recorded", 
      "data": { 
       "videoName":"vs1457013120534_862", 
       "audioCodec":"NellyMoser ASAO", 
       "videoCodec":"H.264", 
       "type":"FLV", 
       "orientation":"landscape", 
       "id":"0", 
       "dateTime":"2016-03-03 15:51:44", 
       "timeZone":"Europe/Bucharest", 
       "payload":"111.111.111.11", 
       "httpReferer":"http://site_from_where_video_was_recorded.com" 
      } 
     }'; 

$data_array = json_decode($payload, true); 

/* store in PHP variables */ 

$ip_address = $data_array['data']['payload']; 
$vid_name = $data_array['data']['videoName']; 
$date_time = $data_array['data']['dateTime']; 
$time_zone = $data_array['data']['timeZone']; 

echo"[ $ip_address/$vid_name/$date_time/$time_zone ]"; 

// EDIT : added query 

include"config.inc.php"; 

// connect to DB 
$mysqli = mysqli_connect("$host", "$user", "$mdp", "$db"); 

if (mysqli_connect_errno()) { echo "Error connecting : " . mysqli_connect_error($mysqli); } 

$query = " INSERT INTO ip_and_videos (`IpAddress`, `VideoName`, `DateTime`, `Timezone`) VALUES (?,?,?,?) "; 
$stmt = $mysqli->prepare($query); 

print_r($stmt->error_list); 

$stmt->bind_param("ssss", $ip_address, $vid_name, $date_time, $time_zone); 

if (!$stmt->execute()) { echo $stmt->error; } else { echo"true"; } 

?> 
+0

Encore un pas de recul .... Je pense que je peux être fatigué ou quelque chose .. –

+0

@ChaceMcguyer: l'avez-vous essayé et sont -il des erreurs lancées avec mon code lorsque vous l'exécutez? si oui, quels sont-ils? EDIT: ** juste ** le code, rien d'autre sur la page, mais vos paramètres pour DB s'il vous plaît – OldPadawan

+0

Je suis toujours en train d'essayer de comprendre cette partie. J'ai téléchargé Aptana et mis en place le ftp.Maintenant, il continue à ouvrir Firefox quand j'essaie d'exécuter le code et ne montre même pas un écho. –

0

Je ne sais pas si vous avez eu le même problème, mais cela ne fonctionne pas pour moi ...

$vid_name = $data_array['data']['videName']; 

je devais utiliser

$vid_name = $data_array->data->videoName; 

Impossible d'utiliser stdClass comme un tableau.

+0

D'ou viens tu la charge? Devrais-je utiliser $ data_array? –

+0

Désolé, j'ai utilisé la charge utile dans l'exemple que j'ai travaillé sur mon machine ... J'ai fait l'édition – Vbudo

+0

Hmm, toujours obtenir 'MySQL retourné un ensemble de résultats vide (ie zéro rangées). (La requête a pris 0,0002 secondes.)' Quand je regarde la base de données. cela doit être le problème –

0

devraient être mieux ainsi

<?php 

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 

/* db variables */ 

$dbhost = 'localhost'; 
$dbname = 'name_db'; 
$dbuser = 'user_db'; 
$dbpass = 'pass_db'; 

/* grab the json */ 

$data = $_POST['payload']; 

/* put json into php associative array */ 

$alldata = json_decode($data,true); 
print_r($alldata); 

/* connect to mysql db */ 

$con = mysql_connect($dbuser, $dbpass, $dbhost) or die('Could not connect: ' . mysql_error()); 

/* select the specific db */ 

mysql_select_db($dbname, $con); 

/* insert the values into the db */ 
foreach($alldata as $data_array) { 

$ip_address = $data_array['data']['payload']; 
$vid_name = $data_array['data']['videoName']; 
$date_time = $data_array['data']['dateTime']; 
$time_zone = $data_array['data']['timeZone']; 

$sql = "INSERT INTO ip_and_videos(IpAddress, VideoName, DateTime, Timezone) VALUES('".$ip_address."','".$vid_name."','".$date_time."','".$time_zone."')"; 
mysql_query($sql); 
echo mysql_errno($con) . ": " . mysql_error($con) . "\n"; 
} 

?> 

Hope this helps

+0

toujours rien dans le db –

+0

@ChaceMcguyer pour comprendre ce qui se passe, j'ai mis à jour le code, il devrait jeter une erreur –

+0

donc je reçois une erreur 'Colonne' IpAddress 'ne peut pas être nulle' sur le code OldPadawans ci-dessous. Je vais donner un coup de feu à celui-ci. –