1
votes

Comment puis-je utiliser php pour parcourir ce json et ajouter les éléments qu'il contient à une base de données mysqli?

J'essaie d'autoriser un utilisateur Android à remplacer une table de base de données. Mon application lit une feuille de calcul Excel depuis le téléphone, ajoute chaque ligne dans un json, puis sérialise le json pour obtenir une chaîne:

$count = 0;
$something = json_decode($serializedJsonString, true);
foreach($something as $obj){
    $count = $count+1;
}
echo $count;

Mon application envoie ensuite le json sérialisé dans un fichier php sur mon serveur où je

array(2) {  [0]=>  object(stdClass)#2 (4) {    ["name"]=>    string(8) 
"catheter"    ["alts"]=>    string(24) "cathater, cathiter, cath"    
["num"]=>    string(3) "134"    }  [1]=>  object(stdClass)#3 (4) {    
["name"]=>    string(4) "cast"    ["alts"]=>    string(0) ""    
["number"]=>    string(0) ""    }}

pour accéder au tableau en question:

var_dump(json_decode($serializedString));

Je suis php stupide, mais J'ai essayé un tas de trucs. Cela me dira combien d'éléments il y a dans le tableau:

[{"name":"catheter","alts":"cathater, cathiter, cath","num":"134"}, 
{"name":"cast","alts":"","num":"2212"}]

J'ai vraiment besoin de pouvoir faire référence à chaque paire d'éléments clé-valeur afin de pouvoir les ajouter à un base de données qui a des colonnes pour nom, alt_names et nombre. Merci un lot.


7 commentaires

Que voulez-vous faire exactement? Voulez-vous juste analyser le JSON? Cela ne semble pas clair d'après votre question.


quelle colonne voulez-vous additionner?


Je veux le parcourir avec une boucle for et coller chaque élément dans une base de données mysqli


afficher la structure de table que vous souhaitez enregistrer dans ces données?


je veux dire le nom de votre table


Ma question était peut-être trop compliquée ... Je veux INSÉRER DANS ma_table ( nom , alt_names , numéro ) VALEURS ('sutures', 'points de suture, seutures', '3453234'); pour chaque élément du json


$ obj ["name"] vous obtiendrait la propriété name dans votre boucle foreach, par exemple. Vous pouvez donc l'utiliser comme paramètre dans votre instruction SQL.


3 Réponses :


1
votes
$count = 0;
$something = json_decode($serializedJsonString, true);
foreach($arr as $item){
    $name = $item["name"];
    $alts = $item["alts"];
    $num = $item["num"];
//make insert query here.
}

0 commentaires

1
votes

Vous pouvez faire quelque chose comme ceci:

$db = new MySQLi(HOST, USER, PASS, SCHEMA, PORT);

$count = 0;
$elems = json_decode($serializedJsonString, true);

$stmt = $db->prepare('INSERT INTO items (name, alt_names, number) VALUES (?,?,?)');

$db->begin_transaction();
foreach($elems as $elem){
    $stmt->bind_param("ssi", $elem['name'], $elem['alts'], $elem['num']);
    $stmt->execute();
    $count = $count+1;
}

$stmt->close();
$db->commit();
$db->close();
echo $count;

Ceci est également sûr contre tout injection SQL . Et j'ai supposé que l'emplacement et l'identifiant sont nullables et non disponibles au moment de cette opération.


5 commentaires

Le seul problème avec cela maintenant est que vous ne lisez pas correctement la structure JSON. $ elems sera un tableau d'objets - regardez les exemples de données dans la question. Vous devez faire une boucle et construire une instruction INSERT pour chaque objet. Je me demande si vous vouliez que prepare () et bind_param () soient dans votre boucle foreach?


Oui, mais avec des déclarations préparées, ce n'est pas si facile. Les performances pourraient être améliorées avec une transaction (puisque les écritures seraient toutes effectuées lors de la validation) ou sans utiliser les instructions préparées et nettoyer les entrées avec real_escape_string .


ce qui n'est pas si simple ?? Je ne comprends pas votre point. Ce code ne fonctionnera pas, c'est ce que je disais. L'appel bind_param () échouera car $ elem n'existe pas à ce moment-là. Je pense que vous avez fait une erreur en mettant cela hors de votre boucle. Je ne parlais pas de transactions ou de performances. Bien que je sois d'accord, il serait préférable pour l'intégrité si toutes les instructions étaient encapsulées dans une transaction, ou si vous faites en sorte que le code génère une seule grande instruction INSERT pour insérer toutes les lignes à la fois.


Désolé, je n'ai pas compris. De plus, en parlant de copier-coller de code qui ne fonctionnera pas, je n'étais pas sûr de l'instruction préparée et j'ai vérifié w3school à ce sujet et j'ai fait cette erreur en regardant ce morceau de code.


w3schools est connu pour ses didacticiels inexacts / périmés, etc., malheureusement. Je l'utilise rarement. Mieux vaut se fier aux pages de documentation PHP. Quoi qu'il en soit merci pour la mise à jour, ayez un vote favorable



2
votes

Peut-être que cela peut vous aider:

$host = 'insert here the host';
$db = 'name of your database';
$username= 'db username';
$password = 'password db';


 // create database connection
 $mysqli = new mysqli($host, $username, $password, $db);
 $mysqli->set_charset("utf8mb4");
 $mysqli->autocommit(FALSE); // manage transaction

foreach($res as $key => $value){
   insert($value,$mysqli);
}
$mysqli->commit();

fonction pour insérer des données (appelez-la en bouclant le tableau)

function insert($element , $mysqli){
    if(isset($element['name']) && isset($element['alts']) && isset($element['num'])){
     $stmt = $mysqli->prepare("INSERT INTO myTable (name, alt_names,number ) VALUES (?, ?, ?)");
     $stmt->bind_param($element['name'], $element['alts'],$element['num']);
     $stmt->execute();
     $stmt->close();
   }

}


6 commentaires

Cela va dans la bonne direction générale, mais a été critiqué pour avoir préconisé une solution vulnérable à l'injection SQL et utilise une bibliothèque différente de celle que l'OP a déclaré vouloir utiliser ...


Considérez également que cela pourrait être transformé en une seule instruction d'insertion SQL qui serait plus efficace ...


@ADyson, en utilisant l'instruction préparée pour éviter l'injection de slq, je mets déjà à jour ma réponse. Merci


Merci mais vous utilisez toujours PDO lorsque la question indique clairement qu'ils veulent utiliser mysqli


Mieux ... mais catch (PDOException $ e) ??


Convenu. Assez pour un vote positif. N.B. Une solution parfaite transformerait cela en une seule instruction SQL (plus efficace), ou au moins l'envelopperait dans une transaction pour garantir l'intégrité. Et idéalement, il gérerait toujours les exceptions (mais pas les exceptions PDO). Mais merci de tout ranger. Cela devrait bien démontrer le concept au PO.