Нужна ваша консультация по этому коду: PHP: <?php session_start(); include_once("include/connectdb.php"); include('include/user_register/uni-auth.php'); ?> <html> <meta http-equiv="refresh" content="2; url=http://www.test1.ru/sigrannost.php"> <?php if (USER_LOGGED){ if (empty($_POST ['namekomand']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['namekomand'])) {echo '<h1 align="center">Имя команды не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Gk']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST['2Gk'])) {echo '<h1 align="center">id 1-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Ld']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['2Ld'])) {echo '<h1 align="center">id 2-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Cd1']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['Cd1'])) {echo '<h1 align="center">id 3-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Cd2']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['2Cd2'])) {echo '<h1 align="center">id 4-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Rd']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['2Rd'])) {echo '<h1 align="center">id 5-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Lm']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['2Lm'])) {echo '<h1 align="center">id 6-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Cm1']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['2Cm1'])) {echo '<h1 align="center">id 7-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Cm2']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['2Cm2'])) {echo '<h1 align="center">id 8-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Rm']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['2Rm'])) {echo '<h1 align="center">id 9-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Cf1']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['2Cf1'])) {echo '<h1 align="center">id 10-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else if (empty($_POST['2Cf2']) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST ['2Cf2'])) { echo '<h1 align="center">id 11-го игрока не задано или ЗАДАНО НЕВЕРНО!!!</h1>';} else { $NameKomand = substr(htmlspecialchars($_POST ['namekomand']),0,20); $2Gk = htmlspecialchars($_POST ['2Gk']); $2Ld = htmlspecialchars($_POST ['2Ld']); $2Cd1 = htmlspecialchars($_POST ['2Cd1']); $2Cd2 = htmlspecialchars($_POST ['2Cd2']); $2Rd = htmlspecialchars($_POST ['2Rd']); $2Lm = htmlspecialchars($_POST ['2Lm']); $2Cm1 = htmlspecialchars($_POST ['2Cm1']); $2Cm2 = htmlspecialchars($_POST ['2Cm2']); $2Rm = htmlspecialchars($_POST ['2Rm']); $2Cf1 = htmlspecialchars($_POST ['2Cf1']); $2Cf2 = htmlspecialchars($_POST ['2Cf2']); $2S1 = htmlspecialchars($_POST ['2S1']); $2S2 = htmlspecialchars($_POST ['2S2']); $2S3 = htmlspecialchars($_POST ['2S3']); $2S4 = htmlspecialchars($_POST ['2S4']); $2S5 = htmlspecialchars($_POST ['2S5']); //задаём уникальное имя для таблицы с матчами: имя пользователя + имя его команды $USER_TABLE_KOMAND = $UserName.$NameKomand; // создаём таблицу $CT_UTK="CREATE TABLE IF NOT EXISTS `$USER_TABLE_KOMAND` (id INT NOT NULL AUTO_INCREMENT, id1 TEXT, id2 TEXT, id3 TEXT, id4 TEXT, id5 TEXT, id6 TEXT, id7 TEXT, id8 TEXT, id9 TEXT, id10 TEXT, id11 TEXT, id12 TEXT, id13 TEXT, id14 TEXT, id15 TEXT, id16 TEXT, PRIMARY KEY ( `id` ))"; mysql_query ($CT_UTK) or die (mysql_error()); // добавляем запись в таблицу $II_UTK = "INSERT INTO `$USER_TABLE_KOMAND` (id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11, id12, id13, id14, id15, id16) VALUES(".$2Gk.", ".$2Ld.", ".$2Cd1.", ".$2Cd2.", ".$2Rd.", ".$2Lm.",".$2Cm1.", ".$2Cm2.",".$2Rm.",".$2Cf1.", ".$2Cf2.", ".$S1.", ".$2S2.",".$2S3.", ".$2S4.",".$2S5.")"; mysql_query ($II_UTK) or die (mysql_error()); mysql_close($dbcnx); echo '<h1 align="center">Ваш состав сохранён!</h1>';}} else{ echo '<h1 align="center">Вы не авторизованы!</h1><br> <h2 align="center">Зарегистрируйтесь или войдите в систему под своим Логином!!!</h2>'; } ?> </html> 1. Обязательно ли обрабатывать каждый элемент массива $_POST[] функциями htmlspecialchars и preg_match или можно сразу весь массив? 2. У меня есть 5-ть необязательных полей $_POST[2S1] $_POST[2S2] $_POST[2S3] $_POST[2S4] $_POST[2S5] Как их внести в таблицу, если они пустые? 3. Надо ли ещё как-то усиливать защиту? 4. Есть ли варианты укоротить код? Заранее спасибо!
1. можно просто попробовать и посмотреть что получится 2. можно просто поставить в таблице default для этих полей. 3. раз уж все эти $2Gk и так далее идут в INSERT, то обрабатывать их логично не htmlspecialchars(), а mysql_real_escape_string() 4. почти одинаковые действия по выводу сообщений можно впихать в цикл или array_walk(), просто создав массив с сообщениями, используя названия полей как индексы массива. Если убрать все else if, то будут выдаваться все ошибки скопом, а не по одной, что имхо достаточно логично.
Это уже исправлено, просто сначала запостил, а после увидел ошибку. PHP: $NameKomand = substr(iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['namekomand'])),0,20); $Gk = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Gk'])); $Ld = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Ld'])); $Cd1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cd1'])); $Cd2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cd2'])); $Rd = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Rd'])); $Lm = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Lm'])); $Cm1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cm1'])); $Cm2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cm2'])); $Rm = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Rm'])); $Cf1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cf1'])); $Cf2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cf2'])); $S1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S1'])); $S2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S2'])); $S3 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S3'])); $S4 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S4'])); $S5 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S5']));
Самое жуткое это 2. У меня есть 5-ть необязательных полей $_POST[2S1] $_POST[2S2] $_POST[2S3] $_POST[2S4] $_POST[2S5] Как их внести в таблицу, если они пустые? Пустые переменные в таблицу не записываются, SQL ругается, что делать? default во всех полях по умолчанию NULL.
PHP: $II_UTK = "INSERT INTO `$USER_TABLE_KOMAND` (id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11, id12, id13, id14, id15, id16) VALUES(".$2Gk.", ".$2Ld.", ".$2Cd1.", ".$2Cd2.", ".$2Rd.", ".$2Lm.",".$2Cm1.", ".$2Cm2.",".$2Rm.",".$2Cf1.", ".$2Cf2.", ".$S1.", ".$2S2." ,".$2S3.", ".$2S4.",".$2S5.")"; В этом коде принудительно задаются 16 полей, чтобы учесть случай со всеми заполненными полями. Я не понимаю как мне отбросить пустые переменные. Если допустим три последние переменные пустые то на код PHP: $II_UTK = "INSERT INTO `$USER_TABLE_KOMAND` (id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11, id12, id13, id14, id15, id16) VALUES(".$2Gk.", ".$2Ld.", ".$2Cd1.", ".$2Cd2.", ".$2Rd.", ".$2Lm.",".$2Cm1.", ".$2Cm2.",".$2Rm.",".$2Cf1.", ".$2Cf2.", ".$S1.", ".$2S2.")"; SQL ругается Думаю что и такой код не прокатит PHP: $II_UTK = "INSERT INTO `$USER_TABLE_KOMAND` (id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11) VALUES(".$2Gk.", ".$2Ld.", ".$2Cd1.", ".$2Cd2.", ".$2Rd.", ".$2Lm.",".$2Cm1.", ".$2Cm2.",".$2Rm.",".$2Cf1.", ".$2Cf2.", ".$S1.", ".$2S2." ,".$2S3.", ".$2S4.",".$2S5.")"; У меня 11 полей обязательных и 5 нет, поэтому сумма полей варьируется от 11 к 16. Из-за этого в коде задано максимальное количество полей - 16 а значит и переменных туда вписать надо 16 иначе SQL ругается. Если необязательная переменная пустая, то тоже ругается. Вот я и в тупике
Формируй строку запроса динамически. Если переменные пустые то нечего и писать соответствующие поля в запрос.
А так нельзя if (empty($_POST['S1']) {$_POST['S1'] = NULL;} Правда у меня не заработало, выдаёт ошибку синтаксиса . На ум приходит только такая реализация: Пишем 5 вариантов SQL запроса. Считаем пустые переменные, если 1(одна) - отправляем 1-й вариант, если 2 - второй вариант и т.д. Или что имелось ввиду?
Можно. Но null или, что проще, пустую строку '' Нет, это плохая реализация Примерно так PHP: <?php // $arr - массив вставляемых значений в виде array(ИМЯ ПОЛЯ => ЗНАЧЕНИЕ) $sql = 'INSERT INTO table'; $fields = ' ( '; $values = ' VALUES ( '; foreach ($arr as $key => $val) { $fields .= $key . ', '; $values .= mysql_real_escape_string($val) . ', '; } $fields = substr($fields, 0, -2) . ')'; $values = substr($values, 0, -2) . ')'; $sql .= $fields . $values;
Значит что понятно: массив $arr это у нас будет $_POST Если в цикле у нас $values .= mysql_real_escape_string($val), то столбик Код (Text): $Gk = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Gk'])); $Ld = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Ld'])); $Cd1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cd1'])); $Cd2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cd2'])); $Rd = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Rd'])); $Lm = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Lm'])); $Cm1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cm1'])); $Cm2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cm2'])); $Rm = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Rm'])); $Cf1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cf1'])); $Cf2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cf2'])); $S1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S1'])); $S2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S2'])); $S3 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S3'])); $S4 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S4'])); $S5 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S5'])); можно почти убрать Непонятно, что обрезает $fields = substr($fields, 0, -2) . ')'; $values = substr($values, 0, -2) . ')'; и каким способом отбрасываются пустые элементы массива?
Разобрался с пустыми переменными, вся беда была в кавычках, поменял их вид : $II_UTK = "INSERT INTO `$USER_TABLE_KOMAND` (id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11, id12, id13, id14, id15, id16) VALUES('$Gk', '$Ld', '$Cd1', '$Cd2', '$Rd', '$Lm','$Cm1', '$Cm2','$Rm','$Cf1', '$Cf2', '$S1', '$S2','$S3', '$S4','$S5')"; mysql_query ($II_UTK) or die (mysql_error()); Впридачу и конкатенация не понадобилась, убрал и её
PHP: $NameKomand = substr(iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['namekomand'])),0,20); $Gk = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Gk'])); $Ld = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Ld'])); $Cd1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cd1'])); $Cd2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cd2'])); $Rd = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Rd'])); $Lm = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Lm'])); $Cm1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cm1'])); $Cm2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cm2'])); $Rm = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Rm'])); $Cf1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cf1'])); $Cf2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2Cf2'])); $S1 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S1'])); $S2 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S2'])); $S3 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S3'])); $S4 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S4'])); $S5 = iconv("UTF-8", "WINDOWS-1251", mysql_real_escape_string($_POST ['2S5'])); Заменил столбик на PHP: <?php foreach ($_POST as $key3){ mysql_real_escape_string(iconv("UTF-8", "WINDOWS-1251", $_POST [$key3])); }?> но чойто не работает, по крайней мере элемент $_POST ['namekomand'] не подвергся обработке функцией iconv В чём проблема то?
Никуда не присваивается результат работы. А еще у вас обращение в массив идет не по индексу, а по значению. foreach ($_POST as $key => $value) { $$key = mysql_real_escape_string(iconv("UTF-8", "WINDOWS-1251", $value)); }
У меня есть такой косяк: если оглядываюсь и вижу, что что-то неровно, то начинаю переделывать. Например, лезу в шкаф, там шмотки как попало лежат и я всё разбираю, перевешиваю, перекладываю, категоризирую. Ой, знали бы как не хочется. И так на несколько часов. Научился с этим боротся вторым своим косяком - врождённым пофигизмом. Если что-то неровно, стараюсь не думать и вообще забить. Работает от случая к случаю. Никогда с кодом не получалось забить и не думать. Если было некрасивенько, то я всё брал и переделывал. Тупо менял даже имена переменных чтобы если они стоят рядом, то максимально одной длинны были. Такой, блин, отстой. Но, наверное, именно благодаря этому никогда не рожал подобный код. Близнецов бы попой родил, но сделал красивенько и понятно. И, пологаю, благодаря этому же, никогда не постил на форумах код, в котором сам же не могу разобраться. Это был офтоп. Спасибо за внимание.
Случайно попал на топик где ты высказался насчёт граберов, - просто прелесть Теперь насчёт твоих косяков, у каждого они свои, например, смотришь в книгу, видишь фигу и т.д. Форум на то и придумали, чтобы общаться. А где и кому мне ещё задавать свои нубские вопросы? Выйти на улицу что ли? А здесь люди добрые, глядишь умных мыслей наслушаюсь, потом сам буду нубов учить Ты знаешь как умному трудно ответить на тупой вопрос? Поэтому ты должен благодарить меня за разминку твоего мозга
Все новички себе этим льстят и считают, что им должны помогать. На самом деле - нам глубоко пофиг. Учить всех подряд не хочется. Помогаем мы только в зависимости от настроения и отношения к человеку. Благодарить мы можем только в случае очень интересных вопросов, которые могут повысить и наши навыки, но никак не за банальщину начального уровня. Мы с ней и так сталкиваемся ежедневно.