Консультация № 174330
17.11.2009, 21:01
0.00 руб.
0 15 1
Здраствуйте уважаемые эксперты!
Я уже обращался к вам за помощью, но вот снова у меня возникли трудности.

1-я проблема.
Первые 11 полей обязательны, поэтому без проблем в цикле проверяются (первый цикл по массиву $keys), а вот с последними необязательными возникли сложности. Пользователь имеет право оставить их пустыми, поэтому во втором цикле (по массиву $keys2) я проверяю только их содержимое и столкнулся с проблемой, что поле ФИО 13 может быть заполнено а соседнее id_13 нет или заполнено через одно, например, ФИО 12 и id_15.

Надо сделать так что если, например, поле ФИО_12 заполнено, то и соседнее напротив id_12 должно быть заполнено и наоборот. Если неправильно, то уведомлять пользователя.

2-я проблема
Я вношу в таблицу данные $II_UTP = "INSERT INTO `USER_TABLE_PLAYERS`(`nick`, `komanda`, `players`, `id_players`)
Но перед тем как данные внесутся, нужно сделать проверку на их существование в базе. Проверка должна происходить по параметрам `players`, `id_players` Если игрок такой существует уже, то данные не записываются.


Скрипт прилагается.


Приложение:
<?php
session_start();
include_once("include/connectdb.php");
include('include/user_register/uni-auth.php');

if (USER_LOGGED){
//проврека в цикле полей формы на корректность заполнения
$keys = array(
array('key'=>'namekomand','note'=>'Ваша команда'),
array('key'=>'1Gk','note'=>'ФИО 1-го игрока'),
array('key'=>'2Gk','note'=>'id 1-го игрока'),
array('key'=>'1Ld','note'=>'ФИО 2-го игрока'),
array('key'=>'2Ld','note'=>'id 2-го игрока'),
array('key'=>'1Cd1','note'=>'ФИО 3-го игрока'),
array('key'=>'2Cd1','note'=>'id 3-го игрока'),
array('key'=>'1Cd2','note'=>'ФИО 4-го игрока'),
array('key'=>'2Cd2','note'=>'id 4-го игрока'),
array('key'=>'1Rd','note'=>'ФИО 5-го игрока'),
array('key'=>'2Rd','note'=>'id 5-го игрока'),
array('key'=>'1Lm','note'=>'ФИО 6-го игрока'),
array('key'=>'2Lm','note'=>'id 6-го игрока'),
array('key'=>'1Cm1','note'=>'ФИО 7-го игрока'),
array('key'=>'2Cm1','note'=>'id 7-го игрока'),
array('key'=>'1Cm2','note'=>'ФИО 8-го игрока'),
array('key'=>'2Cm2','note'=>'id 8-го игрока'),
array('key'=>'1Rm','note'=>'ФИО 9-го игрока'),
array('key'=>'2Rm','note'=>'id 9-го игрока'),
array('key'=>'1Cf1','note'=>'ФИО 10-го игрока'),
array('key'=>'2Cf1','note'=>'id 10-го игрока'),
array('key'=>'1Cf2','note'=>'ФИО 11-го игрока'),
array('key'=>'2Cf2','note'=>'id 11-го игрока'));

$keys2 = array(
array('key'=>'1S1','note'=>'ФИО 12-го игрока'),
array('key'=>'2S1','note'=>'id 12-го игрока'),
array('key'=>'1S2','note'=>'ФИО 13-го игрока'),
array('key'=>'2S2','note'=>'id 13-го игрока'),
array('key'=>'1S3','note'=>'ФИО 14-го игрока'),
array('key'=>'2S3','note'=>'id 14-го игрока'),
array('key'=>'1S4','note'=>'ФИО 15-го игрока'),
array('key'=>'2S4','note'=>'id 15-го игрока'),
array('key'=>'1S5','note'=>'ФИО 16-го игрока'),
array('key'=>'2S5','note'=>'id 16-го игрока'));

$check= true;

foreach ($keys as $key){
if (empty($_POST [$key['key']]) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key['key']])) {
echo '<h2 align="center">Параметр «'.$key['note'].'» пуст или <u>задан неверно</u>!</h2>';
$check = false;
break;
}
}

if ($check){

foreach ($keys2 as $key2){
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key2['key']])) {
echo '<h2 align="center">Параметр «'.$key2['note'].'» <u>задан неверно</u>!</h2>';
$check = false;
break;
}
}

if ($check){

//хотя для числовых значений конвертация не нужна
foreach ($_POST as $key => $value) {
$value = mysql_real_escape_string(iconv("UTF-8", "WINDOWS-1251", $value));
$_POST[$key] = $value;
}

// добавляем запись в таблицу
$II_UTK = "INSERT INTO `USER_TABLE_KOMAND` (nick, komanda, id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11, id12, id13, id14, id15, id16)
VALUES ('".$UserName."', '".$_POST['namekomand']."', '".$_POST['2Gk']."', '".$_POST['2Ld']."', '".$_POST['2Cd1']."', '".$_POST['2Cd2']."', '".$_POST['2Rd']."',
'".$_POST['2Lm']."', '".$_POST['2Cm1']."', '".$_POST['2Cm2']."', '".$_POST['2Rm']."', '".$_POST['2Cf1']."', '".$_POST['2Cf2']."', '".$_POST['2S1']."',
'".$_POST['2S2']."', '".$_POST['2S3']."', '".$_POST['2S4']."', '".$_POST['2S5']."')";
mysql_query ($II_UTK) or die (mysql_error());

$II_UTP = "INSERT INTO `USER_TABLE_PLAYERS` (`nick`, `komanda`, `players`, `id_players`)
VALUES
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Gk']."', '".$_POST['2Gk']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Ld']."', '".$_POST['2Ld']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Cd1']."', '".$_POST['2Cd1']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Cd2']."', '".$_POST['2Cd2']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Rd']."', '".$_POST['2Rd']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Lm']."', '".$_POST['2Lm']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Cm1']."', '".$_POST['2Cm1']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Cm2']."', '".$_POST['2Cm2']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Rm']."', '".$_POST['2Rm']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Cf1']."', '".$_POST['2Cf1']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1Cf2']."', '".$_POST['2Cf2']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1S1']."', '".$_POST['2S1']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1S2']."', '".$_POST['2S2']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1S3']."', '".$_POST['2S3']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1S4']."', '".$_POST['2S4']."'),
('".$UserName."', '".$_POST['namekomand']."', '".$_POST['1S5']."', '".$_POST['2S5']."')";
mysql_query ($II_UTP) or die (mysql_error());
echo '<h2 align="center">Ваш состав сохранён!</h2>';
}
}
}

else{
echo '<h2 align="center">Вы не авторизованы!</h2>

<h3 align="center">Зарегистрируйтесь или войдите в систему под своим Логином!!!</h3>';
}
?>

Обсуждение

Неизвестный
17.11.2009, 21:46
общий
это ответ
Здравствуйте, vasja1602.
По первой проблеме. Попробуйте переопределить значения для массива $keys2 и использвать проверку как указано в приложении.
По второй проблеме скорей всего вам придется заносить значения не одним запросом, а разбить его на составляющие части.
Т.е. сперва вы запросом проверяете на существование, потом заносите данные, если проверка успешна.
Ваши строки вставок (1Gk, 2Ld...) должны превратится в два запроса. Хотя это можно оформить процедурой. (См. приложение)
И вставка тогда будет такими строками
Код:

insert_my_data($UserName, $_POST['namekomand'],$_POST['1Gk'],$_POST['2Gk']) or die (mysql_error());
insert_my_data($UserName, $_POST['namekomand'],$_POST['1Ld'],$_POST['2Ld']) or die (mysql_error());
insert_my_data($UserName, $_POST['namekomand'],$_POST['1Cd1'],$_POST['2Cd1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cd2'],$_POST['2Cd2']) or die (mysql_error());
// и т.д.


Приложение:
Значения для ключей:
$keys2 = array(
array('key1'=>'1S1','note'=>'ФИО 12-го игрока','key2'=>'2S1','note2'=>'id 12-го игрока'),
array('key1'=>'1S2','note'=>'ФИО 13-го игрока','key2'=>'2S2','note2'=>'id 13-го игрока'),
array('key1'=>'1S3','note'=>'ФИО 14-го игрока','key2'=>'2S3','note2'=>'id 14-го игрока'),
array('key1'=>'1S4','note'=>'ФИО 15-го игрока','key2'=>'2S4','note2'=>'id 15-го игрока'),
array('key1'=>'1S5','note'=>'ФИО 16-го игрока','key2'=>'2S5','note'=>'id 16-го игрока'),
);

Проверка:
foreach ($keys2 as $key2){
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key2['key1']])) {
echo '<h2 align="center">Параметр «'.$key2['note1'].'» <u>задан неверно</u>!</h2>';
$check = false;
break;
} elseif (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key2['key2']])) {
echo '<h2 align="center">Параметр «'.$key2['note2'].'» <u>задан неверно</u>!</h2>';
$check = false;
break;
} elseif($_POST [$key2['key1']]!=""){ // Если первый ключ не пустой
if (empty($_POST [$key2['key2']])){ // а второй пустой
echo '<h2 align="center">Параметр «'.$key2['note2'].'» <u>должен быть указан</u>!</h2>';
}
}
}


Процедура добавления записей:
function insert_my_data($nick, $komanda, $players, $id_players){
// Проверяем есть ли такие данные
$sql = "select players from USER_TABLE_PLAYERS where (upper(players)=upper($players))and(upper(id_players)=upper($id_players))";
$result = mysql_query($sql) or die (mysql_error());
$countrow= mysql_num_rows($result);
if ($countrow==0){ // Если нет записей, то добавляем
$sql = "INSERT INTO `USER_TABLE_PLAYERS` (`nick`, `komanda`, `players`, `id_players`)";
$sql.= " VALUES('$nick', '$komanda', '$players', '$id_players')";
return mysql_query($sql);
}
}
5
Спасибо за помощь!
Неизвестный
17.11.2009, 23:49
общий
Selax:
По 1-му вопросу

Код:
elseif($_POST [$key2['key1']]!=""){ // Если первый ключ не пустой
if (empty($_POST [$key2['key2']])){ // а второй пустой
echo '<h2 align="center">Параметр «'.$key2['note2'].'» <u>должен быть указан</u>!</h2>';
$check = false;
break;
}
}

Надо ещё учесть : если второй ключь не пустой а первый пустой

2-й вопрос
Непонял с функцией
Вставил я эту функцию в скрипт
Код:
function insert_my_data($nick, $komanda, $players, $id_players){
// Проверяем есть ли такие данные
$sql = "select players from USER_TABLE_PLAYERS where (upper(players)=upper($players))and(upper(id_players)=upper($id_players))";
$result = mysql_query($sql) or die (mysql_error());
$countrow= mysql_num_rows($result);
if ($countrow==0){ // Если нет записей, то добавляем
$sql = "INSERT INTO `USER_TABLE_PLAYERS` (`nick`, `komanda`, `players`, `id_players`)";
$sql.= " VALUES('$nick', '$komanda', '$players', '$id_players')";
return mysql_query($sql);
}

Состав не сохраняется. Её надо ещё как то вызывать?
function insert_my_data($nick, $komanda, $players, $id_players) - Переменные тоже надо где то обьявить? И куда девать это
Код:
insert_my_data($UserName, $_POST['namekomand'],$_POST['1Gk'],$_POST['2Gk']) or die (mysql_error());
insert_my_data($UserName, $_POST['namekomand'],$_POST['1Ld'],$_POST['2Ld']) or die (mysql_error());
insert_my_data($UserName, $_POST['namekomand'],$_POST['1Cd1'],$_POST['2Cd1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cd2'],$_POST['2Cd2']) or die (mysql_error());// и т.д.

или это просто пример?
Извиняюсь за своё нубство:)
Неизвестный
18.11.2009, 00:06
общий
vasja1602:
По первому вопросу
Добавьте условие для второго ключа. Оно будет аналогично как для первого, только поменяйте местами 1 и 2
По второму вопросу
Да, функцию необходимо вызывать. Переменные нигде не нужно объявлять,это аргументы функции и они используются внутри функции. Вместо этих переменных Вы, при вызове функции, подставляете свои данные. Как вызывать функцию, я показал на примере.
Так где у Вас идет "запись в таблицу", Вы вместо запроса insert должны вставить вызов функции как в моем примере, только добавить далее по смыслу для всех остальных игроков.
Неизвестный
18.11.2009, 00:08
общий
vasja1602:
Да, забыл уточнить. Вашу вставку данных в таблицу использовать не нужно. Вы должны заменить эту вставку на вызов функции. Т.е. вызов этой функции будет где-то около 13 раз
Неизвестный
18.11.2009, 01:07
общий
Selax:
Первый вопрос закрыт.
По второму выдаёт ошибку Unknown column 'кап' in 'where clause'
вроде везде названия колонок правильное.

Код:
<?php
session_start();
include_once("include/connectdb.php");
include('include/user_register/uni-auth.php');

if (USER_LOGGED){
//проврека в цикле полей формы на корректность заполнения
$keys = array(
array('key'=>'namekomand','note'=>'Ваша команда'),
array('key'=>'1Gk','note'=>'ФИО 1-го игрока'),
array('key'=>'2Gk','note'=>'id 1-го игрока'),
array('key'=>'1Ld','note'=>'ФИО 2-го игрока'),
array('key'=>'2Ld','note'=>'id 2-го игрока'),
array('key'=>'1Cd1','note'=>'ФИО 3-го игрока'),
array('key'=>'2Cd1','note'=>'id 3-го игрока'),
array('key'=>'1Cd2','note'=>'ФИО 4-го игрока'),
array('key'=>'2Cd2','note'=>'id 4-го игрока'),
array('key'=>'1Rd','note'=>'ФИО 5-го игрока'),
array('key'=>'2Rd','note'=>'id 5-го игрока'),
array('key'=>'1Lm','note'=>'ФИО 6-го игрока'),
array('key'=>'2Lm','note'=>'id 6-го игрока'),
array('key'=>'1Cm1','note'=>'ФИО 7-го игрока'),
array('key'=>'2Cm1','note'=>'id 7-го игрока'),
array('key'=>'1Cm2','note'=>'ФИО 8-го игрока'),
array('key'=>'2Cm2','note'=>'id 8-го игрока'),
array('key'=>'1Rm','note'=>'ФИО 9-го игрока'),
array('key'=>'2Rm','note'=>'id 9-го игрока'),
array('key'=>'1Cf1','note'=>'ФИО 10-го игрока'),
array('key'=>'2Cf1','note'=>'id 10-го игрока'),
array('key'=>'1Cf2','note'=>'ФИО 11-го игрока'),
array('key'=>'2Cf2','note'=>'id 11-го игрока')
);

$keys2 = array(
array('key1'=>'1S1','note'=>'ФИО 12-го игрока','key2'=>'2S1','note2'=>'id 12-го игрока'),
array('key1'=>'1S2','note'=>'ФИО 13-го игрока','key2'=>'2S2','note2'=>'id 13-го игрока'),
array('key1'=>'1S3','note'=>'ФИО 14-го игрока','key2'=>'2S3','note2'=>'id 14-го игрока'),
array('key1'=>'1S4','note'=>'ФИО 15-го игрока','key2'=>'2S4','note2'=>'id 15-го игрока'),
array('key1'=>'1S5','note'=>'ФИО 16-го игрока','key2'=>'2S5','note'=>'id 16-го игрока'),
);

$check= true;

foreach ($keys as $key){
if (empty($_POST [$key['key']]) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key['key']])) {
echo '<h2 align="center">Параметр «'.$key['note'].'» пуст или <u>задан неверно</u>!</h2>';
$check = false;
break;
}
}

if ($check){

foreach ($keys2 as $key2){
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key2['key1']])) {
echo '<h2 align="center">Параметр «'.$key2['note1'].'» <u>задан неверно</u>!</h2>';
$check = false;
break;
}

elseif (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key2['key2']])) {
echo '<h2 align="center">Параметр «'.$key2['note2'].'» <u>задан неверно</u>!</h2>';
$check = false;
break;
}

elseif($_POST [$key2['key1']]!=""){ // Если первый ключ не пустой
if (empty($_POST [$key2['key2']])){ // а второй пустой
echo '<h2 align="center">Параметр «'.$key2['note2'].'» <u>должен быть указан</u>!</h2>';
$check = false;
break;
}
}
elseif($_POST [$key2['key2']]!=""){ // Если второй ключ не пустой
if (empty($_POST [$key2['key1']])){ // а первый пустой
echo '<h2 align="center">Параметр «'.$key2['note'].'» <u>должен быть указан</u>!</h2>';
$check = false;
break;
}
}
}

if ($check){

//хотя для числовых значений конвертация не нужна
foreach ($_POST as $key => $value) {
$value = mysql_real_escape_string(iconv("UTF-8", "WINDOWS-1251", $value));
$_POST[$key] = $value;
}

// добавляем запись в таблицу
$II_UTK = "INSERT INTO `USER_TABLE_KOMAND` (nick, komanda, id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11, id12, id13, id14, id15, id16)
VALUES ('".$UserName."', '".$_POST['namekomand']."', '".$_POST['2Gk']."', '".$_POST['2Ld']."', '".$_POST['2Cd1']."', '".$_POST['2Cd2']."', '".$_POST['2Rd']."',
'".$_POST['2Lm']."', '".$_POST['2Cm1']."', '".$_POST['2Cm2']."', '".$_POST['2Rm']."', '".$_POST['2Cf1']."', '".$_POST['2Cf2']."', '".$_POST['2S1']."',
'".$_POST['2S2']."', '".$_POST['2S3']."', '".$_POST['2S4']."', '".$_POST['2S5']."')";
mysql_query ($II_UTK) or die (mysql_error());
//добавляем запись в таблицу USER_TABLE_PLAYERS
function insert_my_data($nick, $komanda, $players, $id_players){
// Проверяем есть ли такие данные
$sql = "select players from USER_TABLE_PLAYERS where (upper(players)=upper($players))and(upper(id_players)=upper($id_players))";
$result = mysql_query($sql) or die (mysql_error());
$countrow= mysql_num_rows($result);
if ($countrow==0){ // Если нет записей, то добавляем
$sql = "INSERT INTO `USER_TABLE_PLAYERS` (`nick`, `komanda`, `players`, `id_players`)";
$sql.= " VALUES('$nick', '$komanda', '$players', '$id_players')";
return mysql_query($sql);
}
}
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Gk'],$_POST['2Gk']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Ld'],$_POST['2Ld']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cd1'],$_POST['2Cd1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cd2'],$_POST['2Cd2']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Rd'],$_POST['2Rd']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Lm'],$_POST['2Lm']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cm1'],$_POST['2Cm1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cm2'],$_POST['2Cm2']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Rm'],$_POST['2Rm']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cf1'],$_POST['2Cf1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cf2'],$_POST['2Cf2']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S1'],$_POST['2S1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S2'],$_POST['2S2']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S3'],$_POST['2S3']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S4'],$_POST['2S4']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S5'],$_POST['2S5']) or die (mysql_error());

echo '<h2 align="center">Ваш состав сохранён!</h2>';
}
}
}

else{
echo '<h2 align="center">Вы не авторизованы!</h2>

<h3 align="center">Зарегистрируйтесь или войдите в систему под своим Логином!!!</h3>';
}
?>
Неизвестный
18.11.2009, 01:23
общий
vasja1602:
Каюсь, не обратил сразу внимания, что поля не числовые.
Измените в функции
$sql = "select players from USER_TABLE_PLAYERS where (upper(players)=upper($players))and(upper(id_players)=upper($id_players))";
на
$sql = "select players from USER_TABLE_PLAYERS where (upper(players)=upper('$players'))and(upper(id_players)=upper('$id_players'))";
Т.е. переменные должны быть заключены в одинарные кавычки, ибо они текстовые поля
Неизвестный
18.11.2009, 08:43
общий
Уважаемые, остановитесь! по второй проблеме весь этот огород не нужен - достаточно в базе поставить ключи уникальности на плеера и айди - и ИНСЕРТ при существующих записях не сработает, что и требуется!
Неизвестный
18.11.2009, 12:28
общий
Волков Алексей:
Как по вашему мнению надо переделать
Код:
CREATE TABLE `USER_TABLE_PLAYERS` (
`id` INT NOT NULL AUTO_INCREMENT ,
`nick` VARCHAR( 25 ) NOT NULL ,
`komanda` VARCHAR( 64 ) NOT NULL ,
`players` TEXT NOT NULL ,
`id_players` VARCHAR( 11 ) NOT NULL ,
PRIMARY KEY ( `id` )
);

Неизвестный
18.11.2009, 12:45
общий
Selax:
1. У меня после вызова функции перестала работать строчка
echo '<h2 align="center">Ваш состав сохранён!</h2>';

2. Если сверять только по полю players, то переделать на
$sql = "select players from USER_TABLE_PLAYERS where (upper(players)=upper('$players'))";?
а то
вася 1234
вася 125
имя два раза встречается.

3. И один раз допускается запись пустого поля в столбец players, например

Код:
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S1'],$_POST['2S1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S2'],$_POST['2S2']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S3'],$_POST['2S3']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S4'],$_POST['2S4']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S5'],$_POST['2S5']) or die (mysql_error());

если 3 и 4 поля пустые , то 1 строчка в базу внесётся
Можно ли пустые поля игнорировать?
Неизвестный
18.11.2009, 12:48
общий
vasja1602:
Зависит от содержимого таблицы. Как я себе вижу, нужен запрос вида
CREATE TABLE `USER_TABLE_PLAYERS` (
`id` INT NOT NULL AUTO_INCREMENT ,
`nick` VARCHAR( 25 ) NOT NULL ,
`komanda` VARCHAR( 64 ) NOT NULL ,
`players` VARCHAR( 11 ) NOT NULL ,
`id_players` VARCHAR( 11 ) NOT NULL ,
PRIMARY KEY ( `id` ) ,
UNIQUE KEY ( `players` ) ,
UNIQUE KEY ( `id_players` )

)

Однако Вы установили тип поля `players` в TEXT - если это чем-то обусловлено, тогда почле Вашего запроса Выполните
ALTER TABLE `USER_` ADD UNIQUE KEY ( `players` ( 1000 ) ) , ADD UNIQUE KEY ( `id_players` )

либо, если важно обеспечить уникальность именно пары `players` -`id_players` - тогда запрос

ALTER TABLE `USER_TABLE_PLAYERS` ADD INDEX ( `players` ( 1000 ) , `id_players` )

где 1000 в скобках - максимальный размер индекса, разрешенный для текстового поля.
Неизвестный
18.11.2009, 12:56
общий
Selax:
И кстати, коллеги, возьмите за правило экранировать имена и данные в запросах - имена таблиц и полей косыми, а данные (включая РНР-переменные) - одинарными кавычками - этим вы не только избежите неправильной интерпретации "вась 123", но и взлома путём SQL-инъекции. Не шучу, случаи бывали ;-)
Неизвестный
18.11.2009, 13:09
общий
vasja1602:
1. Проверьте не случается ли какая-нибудь ошибка при работе процедуры
2. Да, запрос будет таким
3. Извините, но не понял условий. Нужно ли записывать пустое поле или же его игнорировать?

P.S. После создания уникальных полей при вставке существующей записи будет вызвана ошибка типа "Dublicate entry 'Вася' for key ......" и скрипт прервется по die(...)
Оставшиеся записи вставлены не будут. Если делать скрипт, основываясь на уникальности полей, то его нужно переделать, и проверять возвращаемую ошибку. Если она "dublicate...", то продолжить, иначе прерваться
Неизвестный
18.11.2009, 13:23
общий
Волков Алексей aka Lupo:
Полностью с Вами согласен, коллега. Но косые кавычки, насколько мне известно, нужны если имя таблицы или поля содержит пробелы или же совпадает с зарезервированным словом. Если такого точно не происходит, то и кавычки необязательны. Впрочем, это остается на усмотрении программиста.
А входящие данные обязательно нужно экранировать. Что у автора вопроса и происходит.
Неизвестный
18.11.2009, 14:15
общий
Selax:
Ну вот, вроде всё работает и пустые поля не записываются:)
Код:
<?php
session_start();
include_once("include/connectdb.php");
include('include/user_register/uni-auth.php');

if (USER_LOGGED){
//проврека в цикле полей формы на корректность заполнения
$keys = array(
array('key'=>'namekomand','note'=>'Ваша команда'),
array('key'=>'1Gk','note'=>'ФИО 1-го игрока'),
array('key'=>'2Gk','note'=>'id 1-го игрока'),
array('key'=>'1Ld','note'=>'ФИО 2-го игрока'),
array('key'=>'2Ld','note'=>'id 2-го игрока'),
array('key'=>'1Cd1','note'=>'ФИО 3-го игрока'),
array('key'=>'2Cd1','note'=>'id 3-го игрока'),
array('key'=>'1Cd2','note'=>'ФИО 4-го игрока'),
array('key'=>'2Cd2','note'=>'id 4-го игрока'),
array('key'=>'1Rd','note'=>'ФИО 5-го игрока'),
array('key'=>'2Rd','note'=>'id 5-го игрока'),
array('key'=>'1Lm','note'=>'ФИО 6-го игрока'),
array('key'=>'2Lm','note'=>'id 6-го игрока'),
array('key'=>'1Cm1','note'=>'ФИО 7-го игрока'),
array('key'=>'2Cm1','note'=>'id 7-го игрока'),
array('key'=>'1Cm2','note'=>'ФИО 8-го игрока'),
array('key'=>'2Cm2','note'=>'id 8-го игрока'),
array('key'=>'1Rm','note'=>'ФИО 9-го игрока'),
array('key'=>'2Rm','note'=>'id 9-го игрока'),
array('key'=>'1Cf1','note'=>'ФИО 10-го игрока'),
array('key'=>'2Cf1','note'=>'id 10-го игрока'),
array('key'=>'1Cf2','note'=>'ФИО 11-го игрока'),
array('key'=>'2Cf2','note'=>'id 11-го игрока')
);

$keys2 = array(
array('key1'=>'1S1','note'=>'ФИО 12-го игрока','key2'=>'2S1','note2'=>'id 12-го игрока'),
array('key1'=>'1S2','note'=>'ФИО 13-го игрока','key2'=>'2S2','note2'=>'id 13-го игрока'),
array('key1'=>'1S3','note'=>'ФИО 14-го игрока','key2'=>'2S3','note2'=>'id 14-го игрока'),
array('key1'=>'1S4','note'=>'ФИО 15-го игрока','key2'=>'2S4','note2'=>'id 15-го игрока'),
array('key1'=>'1S5','note'=>'ФИО 16-го игрока','key2'=>'2S5','note'=>'id 16-го игрока'),
);

$check= true;

foreach ($keys as $key){
if (empty($_POST [$key['key']]) || preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key['key']])) {
echo '<h2 align="center">Параметр «'.$key['note'].'» пуст или <u>задан неверно</u>!</h2>';
$check = false;
break;
}
}

if ($check){

foreach ($keys2 as $key2){
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key2['key1']])) {
echo '<h2 align="center">Параметр «'.$key2['note1'].'» <u>задан неверно</u>!</h2>';
$check = false;
break;
}

elseif (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $_POST [$key2['key2']])) {
echo '<h2 align="center">Параметр «'.$key2['note2'].'» <u>задан неверно</u>!</h2>';
$check = false;
break;
}

elseif($_POST [$key2['key1']]!=""){ // Если первый ключ не пустой
if (empty($_POST [$key2['key2']])){ // а второй пустой
echo '<h2 align="center">Параметр «'.$key2['note2'].'» <u>должен быть указан</u>!</h2>';
$check = false;
break;
}
}
elseif($_POST [$key2['key2']]!=""){ // Если второй ключ не пустой
if (empty($_POST [$key2['key1']])){ // а первый пустой
echo '<h2 align="center">Параметр «'.$key2['note'].'» <u>должен быть указан</u>!</h2>';
$check = false;
break;
}
}
}

if ($check){

//хотя для числовых значений конвертация не нужна
foreach ($_POST as $key => $value) {
$value = mysql_real_escape_string(iconv("UTF-8", "WINDOWS-1251", $value));
$_POST[$key] = $value;
}

// добавляем запись в таблицу
$II_UTK = "INSERT INTO `USER_TABLE_KOMAND` (nick, komanda, id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11, id12, id13, id14, id15, id16)
VALUES ('".$UserName."', '".$_POST['namekomand']."', '".$_POST['2Gk']."', '".$_POST['2Ld']."', '".$_POST['2Cd1']."', '".$_POST['2Cd2']."', '".$_POST['2Rd']."',
'".$_POST['2Lm']."', '".$_POST['2Cm1']."', '".$_POST['2Cm2']."', '".$_POST['2Rm']."', '".$_POST['2Cf1']."', '".$_POST['2Cf2']."', '".$_POST['2S1']."',
'".$_POST['2S2']."', '".$_POST['2S3']."', '".$_POST['2S4']."', '".$_POST['2S5']."')";
mysql_query ($II_UTK) or die (mysql_error());

//добавляем запись в таблицу USER_TABLE_PLAYERS
function insert_my_data($nick, $komanda, $players, $id_players){
// Проверяем есть ли такие данные
$sql = "select players from USER_TABLE_PLAYERS where (upper(players)=upper('$players'))";
$result = mysql_query($sql) or die (mysql_error());
$countrow= mysql_num_rows($result);
if ($countrow==0){ // Если нет записей, то добавляем
$sql = "INSERT INTO `USER_TABLE_PLAYERS` (`nick`, `komanda`, `players`, `id_players`)";
$sql.= " VALUES('$nick', '$komanda', '$players', '$id_players')";
return mysql_query($sql);
}
echo '<h2 align="center">Ваш состав сохранён!</h2>';
}
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Gk'],$_POST['2Gk']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Ld'],$_POST['2Ld']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cd1'],$_POST['2Cd1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cd2'],$_POST['2Cd2']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Rd'],$_POST['2Rd']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Lm'],$_POST['2Lm']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cm1'],$_POST['2Cm1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cm2'],$_POST['2Cm2']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Rm'],$_POST['2Rm']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cf1'],$_POST['2Cf1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1Cf2'],$_POST['2Cf2']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S1'],$_POST['2S1']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S2'],$_POST['2S2']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S3'],$_POST['2S3']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S4'],$_POST['2S4']) or die (mysql_error());
insert_my_data($UserName,$_POST['namekomand'],$_POST['1S5'],$_POST['2S5']) or die (mysql_error());
}
}
}

else{
echo '<h2 align="center">Вы не авторизованы!</h2>

<h3 align="center">Зарегистрируйтесь или войдите в систему под своим Логином!!!</h3>';
}
?>


Я тут не понял насчёт кавычек и экранирования. У меня вроде же весь $_POST экранируется
Код:
foreach ($_POST as $key => $value) {
$value = mysql_real_escape_string(iconv("UTF-8", "WINDOWS-1251", $value));
$_POST[$key] = $value;
}


У меня из сессии приходит переменная $UserName её надо экранировать?
И последний вопросик, что делает функция upper
Неизвестный
18.11.2009, 16:03
общий
vasja1602:
С кавычками все нормально. Кавычки ` используются если имена полей или таблицы совпадают с зарезервированными словами MySQL или содержат пробелы. По этим кавычкам MySQL понимает, что это идет обращение именно к названием полей/таблицы
$_POST у Вас экранируется, больше ничего делать не надо. Переменная $UserName можно экранировать до помещения ее в сессию.
Функция upper преобразует аргумент в верхний регистр. Т.е. upper('вася') будет ВАСЯ
Это нужно для точного сравнения. Если пользователь введет имя игрока 'вася', а в базе есть уже 'Вася', то сравнение 'вася'='Вася' вернет false и в базе будут оба васи.
Форма ответа