Сглаживание результата SQL-запроса для массива PHP

78
8

У меня есть SQL-таблица (модули) с двумя столбцами (id, name). Теперь я могу получить строки из этого через PHP-скрипт, но я хочу использовать значение id в качестве ключа и значение имени в качестве значения в многомерном массиве. Затем я хочу иметь возможность кодировать их в JSON, сохраняя связь между ключом/значением. Я запутал что-то вместе, но он возвращает null.

соответствующий код из index.php

        $mod1 = $core["module1"];
$mod2 = $core["module2"];
$modules = $db->getModulesById($mod1, $mod2); //module names & ids

$response["module"]["mod1"] = $modules[$mod1];
$response["module"]["mod2"] = $modules[$mod2];
$response["module"]["mod1name"] = $modules[$mod1]["name"];
$response["module"]["mod2name"] = $modules[$mod2]["name"];
echo json_encode($response);

Функция из DB_Functions.php

public function getModulesById($mod1, $mod2) {
require_once 'include/Config.php';
$con = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD);
// Check connection
if (!$con)
{
die("Connection error: " . mysqli_connect_error());
}
// selecting database
mysqli_select_db($con, DB_DATABASE) or die(mysqli_connect_error());

$query = "SELECT * FROM modules WHERE id= '$mod1' OR id='$mod2'";
$result = mysqli_query($con, $query);
$arr = array();
while($row = mysqli_fetch_assoc($result)) {
// process each row
//each element of $arr now holds an id and name
$arr[] = $row;
}
// return user details
return mysqli_fetch_array($arr);
close();
}

Я огляделся, но я просто не "получаю", как результат запроса затем разбивается на ключ/значение для нового массива. Если бы кто-то мог ELI5, я был бы признателен. Я просто заинтересован в этом аспекте, это личный проект, поэтому я пока не сосредотачиваюсь на проблемах безопасности, спасибо.

спросил(а) 2017-04-16T21:10:00+03:00 2 года, 10 месяцев назад
1
Решение
50

Вы очень хорошо там

public function getModulesById($mod1, $mod2) {
require_once 'include/Config.php';
$con = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
// Check connection
if (!$con) {
die("Connection error: " . mysqli_connect_error());
}

$query = "SELECT * FROM modules WHERE id= '$mod1' OR id='$mod2'";
$result = mysqli_query($con, $query);
$arr = array();
while($row = mysqli_fetch_assoc($result)) {
$arr[] = $row;
}
// here is wrong
//return mysqli_fetch_array($arr);

// instead return the array youy created
return $arr;
}

И назовите его, а затем просто json_encode возвращенный массив

$mod1 = $core["module1"];
$mod2 = $core["module2"];
$modules = $db->getModulesById($mod1, $mod2); //module names & ids

$response['modules'] = $modules;

echo json_encode($response);

Вы действительно должны использовать подготовленные и параметризованные запросы, чтобы избежать SQL-инъекций, подобных этому

public function getModulesById($mod1, $mod2) {
require_once 'include/Config.php';
$con = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
// Check connection
if (!$con) {
die("Connection error: " . mysqli_connect_error());
}

$sql = "SELECT * FROM modules WHERE id= ? OR id=?";
$stmt = $con->prepare($sql);
$stmt->bind_param('ii', $mod1, $mod2);
$stmt->execute();

$result = $stmt->get_result();

$arr = array();
while($row = mysqli_fetch_assoc($result)) {
$arr[] = $row;
}
// here is wrong
//return mysqli_fetch_array($arr);

// instead return the array youy created
return $arr;
}

ответил(а) 2017-04-16T21:20:00+03:00 2 года, 10 месяцев назад
49

mysqli_fetch_array требует результата результата mysqli_query. Передача построенного массива в mysqli_fetch_array() не будет работать.

Если вы хотите иметь определенное значение из строки для использования в качестве своего ключа, вы не можете разрешить это с помощью любой функции mysqli_ *. Вы могли бы, однако, построить его сами:

while($row = mysqli_fetch_assoc($result)) { 
// process each row
//each element of $arr now holds an id and name
$arr[$row['id']] = $row;
}

mysqli_close($con);

return $arr;

Вы должны закрыть соединение, прежде чем возвращать результат, код, расположенный после return, не будет выполнен.

ответил(а) 2017-04-16T21:19:00+03:00 2 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема