Каков наилучший способ получить результаты запроса MySQL в виде массива в PHP?

#php #mysql #arrays

#php #mysql #массивы

Вопрос:

Я новичок в PHP. У меня есть оператор select, который возвращает 100 значений для конкретной записи. Я бы хотел сохранить эти 100 значений в массиве. Правильная ли это команда для сохранения значений, которые я получаю из оператора select, в массив?

 $result = mysql_query("select * from processed1 where record = ('$id') ");
$data = array();

while($row = mysql_fetch_array($result))
{           
   $data[] = $row;        //IS THIS CORRECT?
}
 

Есть ли способ избежать ввода 100 атрибутов для моей таблицы? пример: $row[1] … $ row [100]

Ответ №1:

Если вы собираетесь изучать PHP в 2011 году, давайте сделаем это правильно.

Во-первых, код mysql_query или mysql_ anything устарел. Больше не используйте его.

Не волнуйтесь — то, что я предлагаю, отлично работает с базами данных mysql, но также отлично работает с любой базой данных:

  • PDO — это то, к чему сообщество PHP продолжает добавлять функции, поэтому я бы использовал это.
  • PDO также намного мощнее и упрощает последующее переключение баз данных.
  • MYSQLi (i означает улучшенный) заменяет устаревшие запросы на основе mysql_, но я бы определенно сразу перешел к использованию PDO.
  • Вы также можете легко создать массив объектов позже, изменив одну строку!

Во-вторых, Фил упомянул fetchAll() . Это конечная цель. Другие способы просто перемещаются по нему по одной строке за раз. При этом используется бульдозер вместо лопаты. Примечание: не лучший способ выбора действительно больших объемов данных, так как он будет использовать память. В противном случае все в порядке.

Для этого используйте подготовленные процедуры для защиты вашего кода от атак SQL-инъекций.

 <?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();

/* Fetch all of the rows into an array */
print("Fetch all of the remaining rows in the result set:n");
$result = $sth->fetchAll();
print_r($result);

?>
 

Ответ №2:

По-моему, ваш код выглядит нормально. Но я бы предложил использовать mysql_fetch_assoc() вместо mysql_fetch_array(), чтобы ключи сопоставлялись с их значениями. Кроме того, используйте mysql_real_escape_string(), чтобы предотвратить внедрение SQL.

  $query = "Select * from processed1 where record = '".mysql_real_escape_string($id)."'";
 $result = mysql_query($query);

 $data = array();

 while($row = mysql_fetch_assoc($result))
 {           
     $data[] = $row;               
 }
 

Ответ №3:

Если вы пытаетесь сохранить все строки базы данных в массив, да, этот код должен это сделать. Однако несколько комментариев:

  1. Как было предложено curiou57, используйте mysql_fetch_assoc() , чтобы иметь возможность ссылаться на столбцы в отдельной строке по их именам. (пример: foreach ($data as $row) { echo $row['columnname']; } )
  2. Убедитесь, что вы выполнили $id , mysql_real_escape_string() если вам нужно продолжать использовать расширение mysql. Это предотвращает атаки SQL-инъекций.
  3. Если вам не нужно продолжать использовать расширение mysql, рассмотрите возможность использования PDO или mysqli.

Ответ №4:

Переключитесь на mysql_fetch_row() , если вы хотите ссылаться на каждый столбец числовым индексом (обратите внимание, на основе нуля). В противном случае это выглядит правильно.

Если вы решите переключиться на PDO, вы можете использовать удобный PDOStatement::fetchAll() метод, используя PDO::FETCH_NUM стиль выборки для извлечения всех строк в виде числовых массивов в массив.

Ответ №5:

Это правильный способ:

 while($rows[] = mysqli_fetch_assoc($result));
array_pop($rows);  // pop the last row off, which is an empty row