2012-05-15 3 views
1

У меня есть форма, которая позволяет моему пользователю редактировать информацию по мере необходимости. В рамках этой формы пользователь может вставить до 5 типов доказательств. Все доказательства хранятся в отдельной таблице:in_array возвращает true, когда элемент не существует

Table: Proof 

proofid - primary key 
banid - foreign key -> links to banlist table which stores all other information 
proof - the link to which contains the proof 
type - the type of proof (image, demo, league, ...) 
number - the index number of the proof (0 up to 4) 

У меня также есть следующий код для обновления или вставки элемента доказательства. Он проходит через каждое поле и проверяет, не выбран ли текущий выбранный элемент в массиве. Если true, он проверяет, находится ли $ i внутри массива, который хранит все числа для выбранного идентификатора запрета.

массив выглядит следующим образом для забаненного 237: Array ([0] => [1] => 1)

Это фактически говорит о том, что первое доказательство поле пусто, но второй нет и что существует запись в таблице.

for($i = 0; $i < 5; $i++) 
{ 
    $proof = $checkprooflist[$i]; 
    $prooftype = $checkprooftypelist[$i]; 

    if (!empty($proof)) 
    {      
     if(!in_array($i, $proofnumberlist)) 
     { 
      $query2 = "INSERT INTO proof (banid, proof, type, number) VALUE ($id, '$proof', '$prooftype', $i)"; 
      $result2 = mysql_query($query2); 
     } 
     else 
     { 
      $query2 = "UPDATE proof SET proof = '$proof', type = '$prooftype' WHERE number = $i AND banid = $id"; 
      $result2 = mysql_query($query2); 
     } 
    }   
} 

У меня есть проблема, однако, что с выше массива, линия if(!in_array($i, $proofnumberlist)) возвращается ложное и, таким образом, не входя в, если заявление, когда $ = 0.

Это работает для всех остальных значений (где $ i = 1, ...) и т. д., но не тогда, когда $ i = 0.

Спасибо за чтение, и я ценю любую помощь, которую вы можете мне дать.

Jon.

ответ

2

С другой стороны, вы можете обойти весь in_array проверку с помощью INSERT ... ON DUPLICATE KEY UPDATE.

Это сделает ваш код более понятным. См http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

+0

Спасибо, Кори. Я рассмотрю это, поскольку я действительно не знал, что такая вещь существует! –

3

Вы должны использовать параметр $strictin_array(), это третий (по умолчанию = false).

Из-за жонглирования типа пустая строка может быть равна 0 и т. Д. Параметр $strict также проверяет типы.

if (!in_array($i, $proofnumberlist, true)) 
+0

Спасибо, Джек, хотя когда я установил $ strict в true, я столкнулся с несколькими другими ошибками и так изменил природу массива, чтобы заполнить его только нулевыми значениями. Этот новый массив теперь работает так, как ожидалось, с $ strict установленным значением false. –

+0

@JYoung рад узнать, что мой код по крайней мере заставил вас исправить это :) –

1

Там нет 0 в этом массиве:

Array ([0] => [1] => 1) 

Элемент с индексом 0 равно нулю, а не 0. Где вы взяли этот массив в первую очередь?

+0

Массив заполняется значениями строк для номера. Тем не менее, когда я прочитал ваш комментарий, я изменил это, чтобы вставить не нулевые значения, чтобы теперь массив читал: [0] => 1. Это само по себе фактически устранило проблему. –

+0

Рад, что это помогло. Для записи мне нравится решение Cory, и именно так я обычно обрабатываю такие запросы в своем собственном коде. – Okonomiyaki3000

Смежные вопросы