Ошибка PHP: не удается использовать скалярное значение в качестве массива… Однако

#php #arrays #medoo

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

Вопрос:

В настоящее время я работаю с medoo.php фреймворк, и хотя я обычно использую их область заявок на github, похоже, что никто на самом деле не использует это … так… В любом случае, когда я запускаю один из моих файлов, который использует «require» для вызова фреймворка, я получаю следующую ошибку:

Предупреждение: Невозможно использовать скалярное значение в качестве массива в /home/…./public_html/projects/friendcodes/medoo.min.php в строке 759

Однако, когда я проверяю код (ниже приведены строки с 752 по 764), я вижу, что на самом деле предполагается проверить, не задано ли значение $where, и если это не так, сделайте его массивом — однако эта ошибка php отличается.

Я предполагаю, что $where это задается как переменная где-то еще, это не массив, но в фреймворке более 100 вхождений переменной и 830 строк кода, которые вы, вероятно, не хотите видеть. (Дайте мне знать в комментарии, и я добавлю его — опять же, это непосредственно из двух последних обновлений / выпусков medoo.)

 public function get($table, $columns, $where = null)
{
    if (!isset($where))
    {
        $where = array();
    }

    $where['LIMIT'] = 1;

    $data = $this->select($table, $columns, $where);

    return isset($data[0]) ? $data[0] : false;
}
  

Мой главный вопрос — как мне исправить эту проблему, не нарушая что-либо в этой среде, которая является чрезвычайно сложной (во всяком случае, для моего уровня)

Обновление: Как глупо с моей стороны! Я нашел проблему. Как и предполагали люди, я называл $ where неправильно. Я вызывал его с:

 $accountinfo = $database->get('xf_user_field_value', ['field_value'], 1);
  

Вместо

 $accountinfo = $database->get('xf_user_field_value', ['field_value'], ["user_id"=>1]);
  

(Где третий аргумент равен $where) Спасибо за помощь, ребята!

Комментарии:

1. if (is_array($where)) $where['LIMIT'] = 1;

2. Если вы знаете, какую страницу / функцию нужно выполнить, чтобы повторить проблему, почему бы не сбросить переменную $where в начале функции get? Затем, прежде чем он выдаст ошибку, вы можете просмотреть его содержимое и узнать, что его вызвало и почему?

3. Как ->get() вызывается? Более конкретно, каков третий аргумент? Вы могли бы настроить обработчик ошибок, который ловит предупреждение, а затем печатает обратную трассировку, если вы не знаете.

4. Всегда ли $where является массивом? Если это так, то у этого есть очень простое решение.

5. Если $where всегда является массивом, он не будет получать сообщение об ошибке, говорящее, что это скаляр.. В этом проблема.

Ответ №1:

Итак, перво-наперво, нам нужно выяснить, что вызывает get , чего не должно быть. В ЭТОМ ВСЯ ПРОБЛЕМА. Проблема не в самой функции, проблема в том, что что-то вызывает ее, используя аргумент для $where , который не является массивом. Изменение библиотеки для исправления одного ошибочного вызова нелепо.

Шаг 1: Временно отредактируйте get функцию, чтобы включить print_r из $where переменной.

 public function get($table, $columns, $where = null)
{
    if(isset($where)) print_r($where);
    if (!isset($where))
    {
        $where = array();
    }

    $where['LIMIT'] = 1;

    $data = $this->select($table, $columns, $where);

    return isset($data[0]) ? $data[0] : false;
}
  

Это покажет нам, прежде чем ошибка выведет значение $where , которое поможет вам найти неправильный get вызов.

Если это не удается, попробуйте использовать встроенную обратную трассировку PHP, чтобы попытаться найти проблему:

 public function get($table, $columns, $where = null)
{
    if(isset($where)) print_r(debug_backtrace());
    if (!isset($where))
    {
        $where = array();
    }

    $where['LIMIT'] = 1;

    $data = $this->select($table, $columns, $where);

    return isset($data[0]) ? $data[0] : false;
}
  

Ответ №2:

->get() Метод вызывается неправильно.

Не удается использовать скалярное значение в качестве массива

Это предупреждение отображается, если $where это true либо числовое значение, либо ресурс. Допустимые вызовы метода включают:

 ->get('table', '*')
->get('table', '*', array('WHERE' => 'foo = "bar"'))
  

Проверьте руководство и исправьте свой код.

Ответ №3:

РЕДАКТИРОВАТЬ 3: попробуйте переместить $where['LIMIT'] = 1; внутрь инструкции isset, так как вы не хотели бы передавать LIMIT 1 в конструктор запроса, если $where передается по ссылке.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Я ничего не знаю о платформе medoo.

 public function get($table, $columns, $where = null)
{
    if (is_null($where))
    {
        $where = array('LIMIT'=>1);
    }



    $data = $this->select($table, $columns, $where);

    return isset($data[0]) ? $data[0] : false;
}
  

Комментарии:

1. На самом деле это не отвечает на вопрос, поскольку empty() вернет то же самое, что и isset(). Скалярное предупреждение все еще существует.

2. хорошо, я попробую что-нибудь еще. как насчет троичного оператора, по умолчанию имеющего значение array()

3. Проблема не в этом, PHP выдает скалярную проблему, потому что он не уверен, является ли where массивом или нет.

4. @EvanDarwin Теперь я вижу проблему. В случаях, когда $where передается по ссылке, а не в виде массива, $where['LIMIT'] = 1; не следует применять, поскольку применяется значение для where.

5. Тот факт, что массив передается по ссылке, не имеет абсолютно никакого значения. Проблема заключается в том, что он не уверен, к какому типу он относится, и отказывается устанавливать значение для ключа в объекте.