#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. Тот факт, что массив передается по ссылке, не имеет абсолютно никакого значения. Проблема заключается в том, что он не уверен, к какому типу он относится, и отказывается устанавливать значение для ключа в объекте.