php $ _POST для получения значений – не лучший способ

РЕДАКТИРОВАТЬ:

Огромное вам спасибо за ваши ответы, вы очень удивляете меня такой мудростью 🙂

Я пытаюсь передать код TuteC немного изменился, но не могу понять, как заставить его работать правильно:

$valor = $_POST['valor']; $post_vars = array('iphone3g1', 'iphone3g2', 'nome', 'iphone41', 'postal', 'apelido'); foreach($post_vars as $var) {   $$var = "'" . mysql_real_escape_string($_POST[$var]). "', "; } $sql = "INSERT INTO clientes (iphone3g1, iphone3g2, nome, iphone41, postal, apelido, valor) VALUES ($$var '$valor')"; $query= mysql_query($sql); 

Я знаю, что в коде есть немного обман, мне нужно будет использовать подстроку, чтобы $$ var не выводил «,» в конце, где мне нужны значения, вместо этого я попытался вставить переменную, которая является значением ($ valor = $ _POST ['valor'];) Что происходит не так?

И для других, кто пытался мне помочь, большое спасибо, я многому учусь здесь, в stackoverflow.

У меня есть форма с несколькими значениями поля, когда вы пытаетесь написать php-файл, который читает эти значения, получилось очень много:

 $codigounico= md5(uniqid(rand())); $modelo=$_POST['selectName']; $serial=$_POST['serial']; $nif=$_POST['nif']; $iphone3g1=$_POST['iphone3g1']; $iphone3g2=$_POST['iphone3g2']; $iphone3g3=$_POST['iphone3g3']; $iphone3g4=$_POST['iphone3g4']; $iphone3gs1=$_POST['iphone3gs1']; $iphone3gs2=$_POST['iphone3gs2']; $iphone3gs3=$_POST['iphone3gs3']; $iphone3gs4=$_POST['iphone3gs4']; $iphone41=$_POST['iphone41']; $iphone42=$_POST['iphone42']; $iphone43=$_POST['iphone43']; $iphone44=$_POST['iphone44']; $total=$_POST['total']; $valor=$_POST['valor']; $nome=$_POST['nome']; $apelido=$_POST['apelido']; $postal=$_POST['postal']; $morada=$_POST['morada']; $notas=$_POST['notas']; $sql="INSERT INTO clientes (postal, morada, nome, apelido, name, serial, iphone3g1, iphone3g2, iphone3g3, iphone3g4, total, valor, iphone3gs1, iphone3gs2, iphone3gs3, iphone3gs4, iphone41, iphone42, iphone43, iphone44, nif, codigounico, Notas)VALUES('$postal', '$morada', '$nome', '$apelido', '$modelo', '$serial', '$iphone3g1', '$iphone3g2', '$iphone3g3', '$iphone3g4', '$total', '$valor', '$iphone3gs1', '$iphone3gs2', '$iphone3gs3', '$iphone3gs4', '$iphone41', '$iphone42', '$iphone43', '$iphone44', '$nif', '$codigounico', '$notas')"; $result=mysql_query($sql); 

Это очень сложный код для поддержки,

могу ли я сделать свою жизнь проще?

Чтобы ограничить переменные POST, которые вы «импортируете», вы можете сделать что-то вроде:

 $post_vars = array('iphone3g1', 'iphone3g2', '...'); foreach($post_vars as $var) { $$var = mysql_real_escape_string($_POST[$var]); } 

EDIT: Изменены mysql_real_escape_string помощью mysql_real_escape_string (спасибо @Czechnology).

Проблема, которую я вижу, повторяет одно и то же имя четыре раза. Вот как я мог бы уменьшить его до двух случаев (вы можете отбросить его до одного с большим количеством финалистов).

 $sql = 'INSERT INTO clientes (postal, morada, nome, apelido, name, serial, iphone3g1, iphone3g2, iphone3g3, iphone3g4, total, valor, iphone3gs1, iphone3gs2, iphone3gs3, iphone3gs4, iphone41, iphone42, iphone43, iphone44, nif, codigounico, Notas) VALUES(:postal, :morada, :nome, :apelido, :modelo, :serial, :iphone3g1, :iphone3g2, :iphone3g3, :iphone3g4, :total, :valor, :iphone3gs1, :iphone3gs2, :iphone3gs3, :iphone3gs4, :iphone41, :iphone42, :iphone43, :iphone44, :nif, :codigounico, :notas)'; preg_match_all('/:(\w+)/', $sql, $inputKeys); $tokens = $inputKeys[0]; $values = array_map($inputKeys[1], function($k){ return mysql_real_escape_string($_POST[$k]); }); $sql = str_replace($tokens, $values, $sql); $result = mysql_query($sql); 

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

 <?php $inputKeys = array('postal', 'morada', 'nome', 'apelido', 'name', 'serial', 'iphone3g1', 'iphone3g2', 'iphone3g3', 'iphone3g4', 'total', 'valor', 'iphone3gs1', 'iphone3gs2', 'iphone3gs3', 'iphone3gs4', 'iphone41', 'iphone42', 'iphone43', 'iphone44', 'nif', 'codigounico', 'Notas'); $keyList = '(' . implode(',', $inputKeys) . ')'; $valueList = 'VALUES ('; foreach ($inputKeys as $k) { $valueList .= mysql_real_escape_string($_POST[$k]); $valueList .= ','; } $valueList = rtrim($valueList, ','); $valueList .= ')'; $sql = 'INSERT INTO clientes '.$keyList.' '.$valueList; $result = mysql_query($sql); 

Этот подход снижает вероятность появления ключей до одного и, вероятно, более естественно с вашим приложением.

У TuteC была хорошая цель, но она не была детализирована.

Это заставляет меня задаться вопросом, почему никто не имеет готового решения, но должен был разработать его на лету. Раньше никто не сталкивался с такой же проблемой?
И почему большинство людей пытаются решить только часть проблемы, получая только переменные.

Цель состоит не в том, чтобы получить переменные.
Цель состоит в том, чтобы получить запрос. Итак, сделайте себе запрос.

 //quite handy way to define an array, saves you from typing zillion quotes $fields = explode(" ","postal morada nome apelido name serial iphone3g1 iphone3g2 iphone3g3 iphone3g4 total valor iphone3gs1 iphone3gs2 iphone3gs3 iphone3gs4 iphone41 iphone42 iphone43 iphone44 nif codigounico Notas"); $sql = "INSERT INTO clientes SET "; foreach ($fields as $field) { if (isset($_POST[$field])) { $sql.= "`$field`='".mysql_real_escape_string($_POST[$field])."', "; } } $sql = substr($set, 0, -2); 

Этот код создаст вам запрос без скуки, повторяя одно и то же имя поля много раз.

Но это все еще не все улучшения, которые вы можете сделать.
Действительно опрятная вещь называется функцией.

 function dbSet($fields) { $set = ''; foreach ($fields as $field) { if (isset($_POST[$field])) { $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', "; } } return substr($set, 0, -2); } 

добавьте эту функцию в свою кодовую библиотеку, которая включена во все ваши скрипты (у вас ее нет?), а затем используйте ее как для запросов на вставку, так и для обновления:

 $_POST['codigounico'] = md5(uniqid(rand()));//a little hack to add custom field(s) if ($action=="update") { $id = intval($_POST['id']); $sql = "UPDATE $table SET ".dbSet($fields)." WHERE id = $id"; } if ($action=="insert") { $sql = "INSERT $table SET ".dbSet($fields); } 

Таким образом, ваш код становится очень коротким, надежным и даже многоразовым.
Единственное, что вам нужно изменить для обработки другой таблицы, – это массив $ fields.

Кажется, ваша база данных не очень хорошо спланирована, так как содержит по-видимому повторяющиеся поля (iphone *). Вы должны нормализовать свою базу данных.

Тот же подход к использованию с подготовленными операциями можно найти в этом моем вопросе: вставка / обновление вспомогательной функции с использованием PDO

Вы можете использовать довольно уродливую часть PHP, называемую переменными переменными, но она обычно считается плохой практикой кодирования. Вы можете одновременно включить вашу базу данных. Код будет выглядеть примерно так:

 foreach($_POST as $key => $value){ $$key = mysql_real_escape_string($value); } 

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

PHP: извлечение

Будьте осторожны, и убедитесь, что вы очистите данные перед их использованием.

 $set = array(); $keys = array('forename', 'surname', 'email'); foreach($keys as $val) { $safe_value = mysqli_escape_string($db, $_POST[$val]); array_push($set, "$val='$safe_value'"); } $set_query = implode(',', $set); 

Затем сделайте свой запрос MySQL чем-то вроде UPDATE table SET $set_query WHERE... или INSERT INTO table SET $set_query .


Если вам нужно проверить, обрезать и т. Д., Сделайте это до вышеуказанного кода следующим образом:

 $_POST["surname"] = trim($_POST["surname"]; 

На самом деле, вы могли бы сделать свою жизнь проще, сделав свой код немного сложнее – избегайте ввода перед вставкой в ​​базу данных!

 $sql = "INSERT INTO clientes SET "postal = '" . mysql_real_escape_string($_POST['postal']) . "', ". "morada = '" . mysql_real_escape_string($_POST['morada']) . "', ". ... 

Во-первых, я рекомендую вам создать такой массив значений:

 $newClient = array( 'codigounico' => md5(uniqid(rand())), 'postal' => $_POST['postal'], 'modelo' => $_POST['selectName'], ... ); 

В этом ключе массива находится имя столбца вашей таблицы MySQL. В коде, который вы указали, не все поля копируются прямо из массива POST (некоторые из них вычисляются, а некоторые ключи POST не равны именам столбцов таблиц), поэтому вы должны использовать гибкий метод. Вы все равно должны указывать все столбцы и значения, но только один раз, чтобы код по-прежнему поддерживался, и у вас не будет никаких ошибок в системе безопасности, если кто-то отправит вам сломанный POST. Что касается меня, это больше похоже на конфигурацию, чем на кодирование.

Затем я рекомендую вам написать аналогичную функцию:

 function buildInsertQuery($tableName, $keyValue) { $result = ''; if (!empty($keyValue)) { $delimiter = ', '; $columns = ''; $values = ''; foreach ($keyValue as $key => $value) { $columns .= $key . $delimiter; $values .= mysql_real_escape_string($value) . $delimiter; } $columns = substr($columns, 0, -length($delimiter)); $values = substr($values, 0, -length($delimiter)); $result = 'INSERT INTO `' . $tableName . '` (' . $columns . ') VALUES (' . $values . ')'; } return $result; } 

И тогда вы можете просто построить свой запрос одним вызовом функции:

 $query = buildInsertQuery('clientes', $newClient);