Мой возмутительно простой оператор IF принимает значение false… когда это неоспоримо верно!

#php #mysql #if-statement

#php #mysql #if-statement

Вопрос:

 if($array[$i]['positiveOrNegative'] == 'p')
  

Это значение массива извлекается из базы данных MySQL, из столбца CHAR (1). Я ввел var_dumped обе переменные и ОБЕ возвращают строку (1) p

Я понятия не имею, почему это неправильно вычисляется, это, честно говоря, сводит меня с ума. Это действительно работает, если я это сделаю p == p . Кроме того, strcmp($array[$i]['positiveOrNegative'],p) возвращает 1 (что означает, что они НЕ совпадают). Как, черт возьми, это могло быть!?

———ОБНОВИТЬ:

Подождите, я, должно быть, сильно ошибся …. теперь моя переменная такая:

  • $array[$i][‘positiveOrNegative’]

  • строка (4) «p»

И

  • var_dump(p)
  • строка (1) «p»

Каким образом переменная p внутри MySQL является строкой (4)???

Больше обновлений…Каждая запись в этом столбце представляет собой строку (4), но все они состоят из одной буквы (n или p). Кроме того, они являются строковыми (4), даже когда я вставляю букву вручную с помощью phpMyAdmin…

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

1. @Jon — да, я пробовал это. Однако взгляните на мое обновление. @SLaks, нет — нет верхнего регистра.

2. @алекс, хммм. Возможно. Моя структура MySQL гласит, что столбец равен latin1_swedish_ci

3. Пожалуйста, попробуйте var_dump для других символов $array[$i][‘positiveOrNegative’]

4. Нравится название вопроса. В нем есть буддистский «дзен»: жизнь — это смерть, печаль — это счастье, истина — это ложь…

5. @Jon — по-прежнему строка (4) для всех переменных в этом столбце… @Стивен, ХА! спасибо, чувак. хахаха.

Ответ №1:

вы пробовали выводить массив на экран, чтобы увидеть результат?

 print_r($array[$i]['positiveOrNegative']);
  

Делая это, вы сможете увидеть все содержимое массива, и любые странности должны выделяться довольно четко.

Причина, по которой я упоминаю это, заключается в том, что может не иметь значения, как именно база данных обрабатывает это, пока сохраняется значение, которое вы можете использовать.

Поэтому, если вы визуально проверите результат своей операции, чтобы убедиться, что не происходит ничего странного, вы могли бы отформатировать вывод базы данных перед выполнением условного сравнения.

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

1. @Jesse Я только что обновил вопрос, взгляните. Моя переменная возвращает строку (4) только для буквы p… как это возможно? есть ли способ это исправить?

2. @Shackrock Ваш вопрос связан с MySQL или PHP, у меня значительно больше опыта работы с PHP, чем со спецификой MySQL? Если вы хотите знать семантику MySQL, единственное предположение, которое я могу предложить, это то, что MySQL обрабатывает ваш ‘p’ как string (4), потому что это его минимум для строкового типа данных? Похоже на то, как компиляторы C создают четыре логических значения, когда вы запрашиваете только одно, а остальные держите в резерве.

3. @Jesse — ну, честно говоря, меня это действительно не волнует в MySQL… Мне просто нужно, чтобы переменная была представлена правильно к моменту ее попадания в сравнение -> итак, есть ли какая-нибудь операция PHP, которую я могу выполнить с переменной, чтобы вернуть ее к string (1)? Кстати, в базе данных уже есть CHAR (1), насколько мне известно, это не должно быть string (4)…

4. @Shackrock PHP слабо типизирован, поэтому он должен интерпретировать и присваивать тип данных для вас, когда вы присваиваете его переменной. Возможно, попробуйте сохранить этот элемент в локальной переменной, а затем выполнить сравнение. У моего друга была похожая проблема с типом данных «bit» в MsSQL, я думаю, это просто проблема с преобразованием, поэтому я думаю, что этот ввод вручную в PHP может помочь? [ссылка] php.net/manual/en/function.strcmp.php , это или Алекс может быть прав, и у вас странная проблема с кодировкой набора символов…

5. @Джесси, я мечтал о тебе .. ха-ха. Нет, не повезло. Тот же результат. Это просто кажется мне таким безумным. Есть ли какая-нибудь операция со строками, которую я могу использовать?

Ответ №2:

Повторите его и выполните od -c . Это точно покажет вам, что PHP имеет в переменной. Оттуда вы можете очистить данные и, возможно, исправить процесс, который вставляет эти искаженные данные в первую очередь.

 php somescript.php | od -c
  

Ответ №3:

Если строка действительно содержит 4 байта, попробуйте выполнить следующее, чтобы мы могли дополнительно изучить содержимое:

 print_r(array_map('ord', str_split($array[$i]['positiveOrNegative'])));