#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
. еще раз спасибо, особенно за пояснительную часть