Я ищу помощь по игнорированию нулевых значений для обновления базы данных mysql:
$cst = $_POST['custname']; $a = $_POST['tel']; $b = $_POST['fax']; $c = $_POST['email']; $sql = mysql_query("UPDATE contacts SET TEL = '$a', FAX = '$b', EMAIL = '$c' WHERE Cust_Name = '$cst' ");
как включить параметр, когда пользователь может выбрать только одно или все поля для обновления.
Я попытался использовать следующий код на основе полученных ответов, но он делает то же самое. перезаписывает существующие данные пустыми.
$upd = mysql_query("UPDATE custcomm_T SET Telephone = ".(is_null($a)?'Telephone':"'$a'").", Fax = ".(is_null($b)?'Fax':"'$b'").", Mobile = ".(is_null($c)?'Mobile':"'$c'").", EMail = ".(is_null($d)?'EMail':"'$d'").", trlicense = ".(is_null($e)?'trlicense':"'$e'").", trlicexp = ".(is_null($f)?'trlicexp':"'$f'")." WHERE Cust_Name_VC = '$g' ") or die(mysql_error());
Во-первых, помните, чтобы избегать любых строк, приходящих к вам через POST, GET или REQUEST (прочитайте об атаках SQL-инъекций, если вы не знаете почему).
Что-то вроде этого может работать:
$semaphore = false; $query = "UPDATE contacts SET "; $fields = array('tel','fax','email'); foreach ($fields as $field) { if (isset($_POST[$field]) and !empty($_POST[$field]) { $var = mysql_real_escape_string($_POST[$field]); $query .= uppercase($field) . " = '$var'"; $semaphore = true; } } if ($semaphore) { $query .= " WHERE Cust_Name = '$cst'"; mysql_query($query); }
NB : Никогда не пропустите цикл массива $ _POST, чтобы создать инструкцию SQL. Оппонент может добавить дополнительные поля POST и, возможно, вызвать вред. Цитирование через пользовательский входной массив также может привести к вектору инъекции: имена полей должны быть добавлены в оператор, то есть они являются потенциальным вектором. Стандартные методы предотвращения инъекций (подготовленные параметры оператора, функции цитирования с драйверами) не будут работать для идентификаторов. Вместо этого используйте белый список полей для установки и перебирайте белый список или передайте входной массив через белый список.
Вам нужно построить свой запрос. Что-то вроде этого:
$query = 'update contacts set '; if ($_POST['tel'] != '') $query .= 'TEL="'.$_POST['tel'].'", '; if ($_POST['fax'] != '') $query .= 'FAX="'.$_POST['fax'].'", '; if ($_POST['email'] != '') $query .= 'EMAIL="'.$_POST['email'].'", '; $query .= "Cust_Name = '$cst' where Cust_Name = '$cst'";
Последнее поле обновления: Cust_Name = '$ cst' в основном состоит в том, чтобы «удалить» последнюю запятую.
Помня о том, что значения $ _POST должны быть очищены перед использованием и что все значения $ _POST являются строками, поэтому пустым полем является '', а не null, что-то вроде этого будет работать:
foreach ($_POST as $var=>$value) { if(empty($value)) continue; //skip blank fields (may be problematic if you're trying to update a field to be empty) $sets[]="$var= '$value"; } $set=implode(', ',$sets); $q_save="UPDATE mytable SET $set WHERE blah=$foo";
Это должно работать (путь MySQL):
"UPDATE `custcomm_T` SET `Telephone` = IF(TRIM('" . mysql_real_escape_string($a) . "') != '', '" . mysql_real_escape_string($a) . "', `Telephone`), SET `Fax` = IF(TRIM('" . mysql_real_escape_string($b) . "') != '', '" . mysql_real_escape_string($b) . "', `Fax`), SET `Mobile` = IF(TRIM('" . mysql_real_escape_string($c) . "') != '', '" . mysql_real_escape_string($c) . "', `Mobile`), SET `EMail` = IF(TRIM('" . mysql_real_escape_string($d) . "') != '', '" . mysql_real_escape_string($d) . "', `EMail`), SET `trlicense` = IF(TRIM('" . mysql_real_escape_string($e) . "') != '', '" . mysql_real_escape_string($e) . "', `trilicense`), SET `trlicexp` = IF(TRIM('" . mysql_real_escape_string($f) . "') != '', '" . mysql_real_escape_string($f) . "', `trlicexp`) WHERE Cust_Name_VC = '" . mysql_real_escape_string($g) . '";
Я попытался сохранить столбцы и переменные в том, что вы разместили в своем вопросе, но не стесняйтесь исправлять их в соответствии с вашей схемой.
Надеюсь, поможет.
Прокрутите дополнительные поля ввода, создайте поля, которые нужно установить. Имена полей и значения должны храниться отдельно, чтобы вы могли использовать подготовленный оператор. Вы также можете перебрать требуемые поля в качестве базового шага проверки.
# arrays of input => db field names. If both are the same, no index is required. $optional = array('tel' => 'telephone', 'fax', 'email'); $required = array('custname' => 'cust_name'); # $input is used rather than $_POST directly, so the code can easily be adapted to # work with any array. $input =& $_POST; /* Basic validation: check that required fields are non-empty. More than is necessary for the example problem, but this will work more generally for an arbitrary number of required fields. In production code, validation should be handled by a separate method/class/module. */ foreach ($required as $key => $field) { # allows for input name to be different from column name, or not if (is_int($key)) { $key = $field; } if (empty($input[$key])) { # error: input field is required $errors[$key] = "empty"; } } if ($errors) { # present errors to user. ... } else { # Build the statement and argument array. $toSet = array(); $args = array(); foreach ($optional as $key => $field) { # allows for input name to be different from column name, or not if (is_int($key)) { $key = $field; } if (! empty($input[$key])) { $toSet[] = "$key = ?"; $args[] = $input[$key]; } } if ($toSet) { $updateContactsStmt = "UPDATE contacts SET " . join(', ', $toSet) . " WHERE cust_name = ?"; $args[] = $input['custname']; try { $updateContacts = $db->prepare($updateContactsStmt); if (! $updateContacts->execute($args)) { # update failed ... } } catch (PDOException $exc) { # DB error. Don't reveal exact error message to non-admins. ... } } else { # error: no fields to update. Inform user. ... } }
Это должно обрабатываться на уровне доступа к данным, предназначенном для сопоставления между базой данных и объектами программы. Если вы умны, вы можете написать один метод, который будет работать для произвольных моделей (связанные формы, таблицы и классы).
mysql_query(" UPDATE contacts SET TEL = ".(is_null($a)?'TEL':"'$a'").", FAX = ".(is_null($b)?'FAX':"'$b'").", EMAIL = ".(is_null($c)?'EMAIL':"'$c'")." WHERE Cust_Name = '$cst' ");