#php #mysql #arrays
#php #mysql #массивы
Вопрос:
Я пытаюсь собрать функцию, которая выполняет следующее:
- извлечение строки в формате JSON из формы
- расшифруйте строку в массив php
- перебирайте сгенерированный массив php, чтобы получить значения для каждой части массива, чтобы я мог обновить таблицу MySQL
Вот мой функциональный код до сих пор:
public function saveTestimonials() {
$existing_testimonials_update = $this->post('data');
$update_array = json_decode($existing_testimonials_update);
foreach ($update_array as $key => $testimonials) {
foreach($testimonials as $key => $value) {
//echo "$key = $valuen";
}
}
$db = Loader::db();
$sql = "UPDATE testimonials SET name=var, content=var WHERE id=var";
$db->query($sql);
$this->redirect('/dashboard/testimonials/');
}
Вот массив, хранящийся в переменной $update_array:
Array
(
[0] => stdClass Object
(
[id] => 1
[name] => Mr. John Doe, Manager, ABC Ltd
[content] => my content 1.
)
[1] => stdClass Object
(
[id] => 2
[name] => Mr. Joe Smith, Manager, ABC Industries
[content] => my content 2.
)
[2] => stdClass Object
(
[id] => 3
[name] => Mr. Mike Smith, Manager, ABC Industries
[content] => my content 3.
)
[3] => stdClass Object
(
[id] => 4
[name] => Ms. Jane Doe, Manager, ABCD Ltd
[content] => my content 4.
)
)
У меня есть шаги 1 и 2, которые работают нормально, однако я застрял на шаге 3.
Я все еще изучаю PHP и время от времени сталкиваюсь с синтаксисом. Я пытался разобраться с этим самостоятельно и потратил на это несколько часов, но, похоже, просто не могу разобраться в этом.
Любая помощь очень ценится.
Ответ №1:
foreach ($update_array as $key => $testimonials) {
$name = mysql_real_escape_string($testimonials->name);
$content = mysql_real_escape_string($testimonials->content);
$id = intval($testimonials->id);
$sql = "UPDATE testimonials SET name='$name', content='$content' WHERE id=$id";
$result = mysql_query($sql);
if ($result === FALSE) {
die(mysql_error());
}
}
Ответ №2:
Я использую что-то вроде этого. Может быть, это поможет вам!
function updateDbRecord($db, $table, $carry, $carryUrl) {
mysql_select_db($db) or die("Could not select database. " . mysql_error());
$resultInsert = mysql_query("SHOW COLUMNS FROM " . $table . " WHERE Field NOT IN ('id')");
$fieldnames=array();
if (mysql_num_rows($resultInsert) > 0) {
while ($row = mysql_fetch_array($resultInsert)) {
$fieldnames[] = $row['Field'];
$array = array_intersect_key( $_POST, array_flip($fieldnames) );
}
}
foreach ($array as $key => $value) {
$value = mysql_real_escape_string($value);
$value = "'$value'";
$updates[] = "$key = $value";
}
$implodeArray = implode(', ', $updates);
$sql = sprintf("UPDATE %s SET %s WHERE id='%s'", $table, $implodeArray, $_POST['id']);
mysql_query($sql);
if ($carry == 'yes') {
redirect($carryUrl.'?id='.$_REQUEST['id'].'amp;'.$table);
} else { echo "Done!"; }
}
Ответ №3:
Это объекты, с которыми вы имеете дело внутри update_array, поэтому вы должны иметь к ним доступ следующим образом:
$update_array = json_decode($existing_testimonials_update);
foreach ($update_array as $key => $testimonials) {
$testimonials = (array) $testimonials;
foreach($testimonials as $key => $value) {
//echo "$key = $valuen";
}
}
Или, проще говоря, вы можете использовать оператор стрелки ($testimonials-> name) для доступа к переменным.
Ответ №4:
Вы получаете объект из json_decode(). Если вы передадите true в качестве второго аргумента в json_decode(), вы получите ассоциативный массив.
Ответ №5:
попробуйте что-то вроде этого
$db = Loader::db();
foreach ($update_array as $key => $testimonials) {
foreach($testimonials as $testimonial) {
// escape data to avoid sql injection
$id = mysql_escape_string($testimonial->id);
$name = mysql_escape_string($testimonial->name);
$content = mysql_escape_string($testimonial->content);
$sql = "UPDATE testimonials SET name='$name', content='$content' WHERE id='$id'";
$db->query($sql);
// TODO check for database error here
}
}
Ответ №6:
function update($table_name, $myarray, $my_wheres) {
$sql = "Update`".$table_name.
"` SET ";
$i = 0;
foreach($myarray as $key => $value) {
$sql.= $key." = '".$value."'";
if ($i < count($myarray) - 1) {
$sql.= " , ";
}
$i ;
}
if (count($my_wheres) > 0) {
$sql.= " WHERE ";
$i = 0;
foreach($my_wheres as $key => $value) {
$sql.= $key.
" = ".$value;
if ($i < count($my_wheres) - 1) {
$sql.= " AND ";
}
$i ;
}
}
return mysqli_query($sql);
}
Надеюсь, этот код может вам помочь. Я думаю, не стоит пытаться обновлять одно за другим. Подумайте о производительности.