вставка значений из объекта, где ключами являются имена столбцов

#php #mysql

#php #mysql

Вопрос:

У меня есть json_encoded string где keys column names и нужно вставить соответствующие values

 $str = {"fname":"lorem","sname":"ipsum","nick":"dolor"};
  

fname sname nick — это имена столбцов — и их нужно вставить lorem ipsum dolor

Я создал объект $obj = json_decode($str); — но что тогда?

в простом примере — без объекта — это было бы так:

 function insert($fname, $sname, $nick){
    $sq = "insert into table (fname, sname, nick) values (:afname, :asname, :anick)";
    $st = $db->prepare($sq);
    $st->execute([
        ":afname" => $fname, // lorem
        ":asname" => $sname, // ipsum
        ":anick" => $nick  // dolor
    ]);

}
  

как это сделать, используя данный объект?

Комментарии:

1. Вы пробовали что-то вроде print_r($obj); посмотреть, что он содержит, а затем перевести значения?

2. @NigelRen — переведите значения в… что? И почему? Это правильные значения, готовы к вставке?

3. Если вы посмотрите на значения в объекте, то посмотрите на функцию, которую вы вызываете. Какие части объекта переходят к каким полям при вызове функции?

Ответ №1:

После создания объекта просто передайте их в insert метод (используйте вышеупомянутый insert метод)

 $obj = json_decode($str);
insert($obj->fname, $obj->sname, $obj->nick);
  

Если вы хотите передать как объект в функции, вы можете сделать это следующим образом.

 function insert($obj){
    $sq = "insert into table (fname, sname, nick) values (:afname, :asname, :anick)";
    $st = $db->prepare($sq);
    $st->execute([
        ":afname" => $obj->fname, // lorem
        ":asname" => $obj->sname, // ipsum
        ":anick" => $obj->nick  // dolor
    ]);

}
  

Если вы хотите использовать динамически вставлять столбцы с их значениями. Вы можете сделать это следующим образом.

 $arr = json_decode($str, true);

$sq = "insert into table (". implode(', ', array_keys($arr)) . ") values (" . implode(',',array_fill(0, count($arr),"?")) . ")";
$st = $db->prepare($sq);
$st->execute(array_values($arr));
  

Здесь

  • implode(', ', array_keys($arr)) — создайте имена столбцов, разделенные запятыми, на основе ключей массива.
  • implode(',',array_fill(0, count($arr),"?")) — создать ? для подготовленного оператора. Число ? будет равно длине массива, а затем объединено с , .
  • array_values($arr) передача значений в виде массива.

Комментарии:

1. Я думаю, это сработает. Просто хочу знать, есть ли способ сказать так — insert into table ($obj->keys) values ($obj->values - replaced by :a)

2. да, это тоже можно сделать. Найдите array_keys и array_values .

3. $obj не является array , но object

4. вы можете сделать это $arr = json_decode($str, true) , и вы получите массив.

5. ты magic_master . еще раз спасибо, особенно за пояснительную часть