#php #arrays #indexing #undefined
#php #массивы #индексирование #неопределенный
Вопрос:
Я хочу иметь функцию selectAll, которая принимает несколько аргументов (класс, таблица, поле сортировки и порядок сортировки.) Комментарии объясняют, что происходит (или что предполагается.)
public static function SelectAll($class, $table, $sort_field, $sort_order = "ASC")
{
/* First, the function performs a MySQL query using the provided arguments. */
$query = "SELECT * FROM " .$table. " ORDER BY " .$sort_field. " " .$sort_order;
$result = mysql_query($query);
/* Next, the function dynamically gathers the appropriate number and names of properties. */
$num_fields = mysql_num_fields($result);
for($i=0; $i < ($num_fields); $i )
{
$fetch = mysql_fetch_field($result, $i);
$properties[$i] = "'".$fetch->name."'";
}
/*echo [$properties[0]; echo "<br />";}*/
/* Finally, the function produces and returns an array of constructed objects. */
while($row = mysql_fetch_assoc($result))
{
for($i=0; $i < ($num_fields); $i )
{
$args[$i] = $row[$properties[$i]];
}
$array[] = call_user_func_array(new $class, $args);
} return $array; }
Теперь проблема, с которой я сталкиваюсь, заключается в том, $row[$properties[$i]]
что приводит к «неопределенному индексу».
Сразу после того, как функция собирает количество / имена полей и сохраняет их в массиве, я могу повторить значение $properties[0]
, и оно показывает, как и должно, ‘id’, но $row[~anything here~]
просто не будет работать, если я вручную не введу значение, например $row['id']
. Как вы можете себе представить, очень расстраивает и сбивает с толку.
Почему это не сработает? Существуют ли какие-либо решения или альтернативные способы выполнения этой функции?
Ответ №1:
Как я вижу, ваши $properties[$i]
элементы массива имеют заключенные в кавычки "'id'"
значения, такие как $row[$properties[$i]]
, поэтому $row["'id'"]
<==> $row["id"]
!= и т. Д.;
И вы можете захотеть проверить $result === false
после $result = mysql_query($query);
В любом случае, я думаю, вы могли бы заменить свою функцию на эту (если вы не создали ее только для демонстрации):
public static function SelectAll($class, $method_name, $table, $sort_field, $sort_order = "ASC"){
/* First, the function performs a MySQL query using the provided arguments. */
$query = "SELECT * FROM " .$table. " ORDER BY " .$sort_field. " " .$sort_order;
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
$array[] = call_user_func_array(array($class,'__construct'), $row);
return $array;
}
Комментарии:
1. Спасибо за ответ: когда я повторяю
$properties[0]
или так далее, я получаю значение'id'
обратно. Таким образом,$properties[0]
кажется, что это равно'id'
, поэтому$row[$properties[$0]]
должно составлять$row['id']
. Возможно, вы просто видите кавычки, используемые для окружения строки, потому что она объединяет два апострофа вокруг$fetch->name
.2. Но почему вы используете апострофы, почему бы просто не использовать
$properties[$i] = $fetch->name;
?3. Теперь я понимаю, что вы имеете в виду. Спасибо! Это решило проблему с вызовом
$row[$properties[$i]]
, хотя теперь, похоже, у меня ошибка из call_user_func_array:Object of class Product could not be converted to string
… Я полагаю, так оно и есть…4. Смотрите внизу примера 1 из php.net/manual/en/function.call-user-func-array.php , это может помочь. Также обновлен пример.
5. Спасибо, однако то, что я пытаюсь сделать, это передать аргументы методу __construct для динамически заданного класса. Кроме того, я думаю, что передача по всей строке приведет к сбросу большого количества информации, а не к запросу этих конкретных вещей, не так ли?