Неопределенный индекс ТОЛЬКО при использовании массива

#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 для динамически заданного класса. Кроме того, я думаю, что передача по всей строке приведет к сбросу большого количества информации, а не к запросу этих конкретных вещей, не так ли?