#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:
Если вы пытаетесь сохранить все строки базы данных в массив, да, этот код должен это сделать. Однако несколько комментариев:
- Как было предложено curiou57, используйте
mysql_fetch_assoc()
, чтобы иметь возможность ссылаться на столбцы в отдельной строке по их именам. (пример:foreach ($data as $row) { echo $row['columnname']; }
) - Убедитесь, что вы выполнили
$id
,mysql_real_escape_string()
если вам нужно продолжать использовать расширение mysql. Это предотвращает атаки SQL-инъекций. - Если вам не нужно продолжать использовать расширение 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