Перейти к содержимому

Фото
- - - - -

MySQL запросы


  • Вы не можете создать новую тему
  • Please log in to reply
29 ответов в этой теме

#1 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 18 Октябрь 2008 - 22:06

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

Проблему, которую я встретил:

Через форму я получаю на сайте переменные $msg1, $msg2, $msg3, $msg4, которые имеют значения Ф1, Ф2, Ф3, Ф4 (например)

Можно ли занести их в БД в один столбец одновременно через запятую?

insert into users (username,password,email,biography) values ('$username','$password','$email','$msg1, $msg2, $msg3, $msg4')"

заранее спасибо.

Прошу лишь помощи, лишняя критика и оскорбления, я думаю излишни. Не для этого и создаю тут темы.
  • 0

#2 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 19 Октябрь 2008 - 09:42

Ап. Что никто не знает, можно или нет?)
  • 0

#3 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 19 Октябрь 2008 - 09:57

AgentVlad,
<?php
$array = array($msg1,$msg2,$msg3,$msg4);
$data = implode(',', $array);
$sql = insert into users (username,password,email,biography) values ('$username','$password','$data')";

Типо так ? : )
?>
  • 0

#4 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 19 Октябрь 2008 - 10:21

Otacon, не знаю, работает ли , но все равно охромное спасибо. А правильно ли будет, если я напишу так

<?php
$array = array($msg1,$msg2,$msg3,$msg4);
$data = implode(',', $array);
$array2 = array($psg1,$psg2,$psg3,$psg4);
$data2 = implode(',', $array2);
$array3 = array($csg1,$csg2,$csg3,$csg4);
$data3 = implode(',', $array3);
$sql = insert into users (username,password,biography, status,job) values ('$username','$password','$data','$data2','$data3')";

//Правильно ли?
?>
  • 0

#5 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 19 Октябрь 2008 - 10:30

AgentVlad, Впринципе правильно : ) Но это зависит от структуры твоей БД : ) Но в некоторых случаях действительно удобнее через запятую записать, а в некоторых лучше отдельное поле создать :)
  • 0

#6 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 03 Ноябрь 2008 - 19:00

Народ_ помогите дельным советом. Нелепо получается.

<?php
$array = array($msg1,$msg2,$msg3,$msg4);
$data = implode(',', $array);
?>

Эти строки работаю в том случае, если мы 100% получаем все 4 переменные из формы.
А если пользователь выбрал только 1-3 переменные, он сразу выдает ошибку, что не удалось записать 4 переменные в одну.
так как отсутствует какая-то переменная.

Такой вариант как:
<?php
if (!isset($_POST['msg1'])) {$msg1= "";}
$array = array($msg1,$msg2,$msg3,$msg4);
$data = implode(',', $array);
?>

Искусственно создать переменную, тоже не вариант.
Просто при запросе будет следующее
,,а,а,а

Двойная запятая.

Можно ли сделать так, если одна переменная не существует, то не записывать её.

Такой вариант как:

<?php
if (!isset($_POST['msg1']))
{
$array = array($msg2,$msg3,$msg4);
$data = implode(',', $array);
}

?>
Не катит, так как переменных куча, и для каждой такое прописывать :wacko:

Люди доббрые выручайте....
  • 0

#7 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 03 Ноябрь 2008 - 19:38

<?php
$msg1 = '';
$msg2 = 'a';
$msg3 = 'a';
$msg4 = 'a';

function filter($var)
{
return(!empty($var));
}

$array = array($msg1,$msg2,$msg3,$msg4);
$array = array_filter($array, 'filter');
$data = implode(',', $array);

print $data;
?>
Вроде работает :)

Сообщение изменено: Otacon (03 Ноябрь 2008 - 19:39 )

  • 0

#8 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 03 Ноябрь 2008 - 22:14

по-моему нас кто-то разводит! :)
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#9 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 03 Ноябрь 2008 - 22:23

Incubo, Кого это нас ? =]
  • 0

#10 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 03 Ноябрь 2008 - 22:33

Otacon, всех кто пытается помочь этому человеку ... он сам задает вопрос ... потом на него правильно отвечает... по-моему программист (читать практик) сперва попробует, а потом будет задавать вопросы.
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#11 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 03 Ноябрь 2008 - 22:45

Incubo, Ну вариант то он нашёл ( на вопрос можно сказать ответил ), только вариант очень неуниверсальный и не удобный( для каждого $msg прописывать условие - это геморой), поэтому и спросил, есть ли вариант покороче и поудобней )
  • 0

#12 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 04 Ноябрь 2008 - 18:15

Otacon, отлично! С меня выпивка, фактически в любое время! Большое спасибо!

Incubo, нет, ты не прав, я просто привел примеры, которые мне не подходят, чисто практически.
Если я задаю вопрос, я всегда ищу на него ответы, потом просто пишу какое решение все-таки нашел.

П.С. Я просто учусь работать с PHP и MySql. Благодарен за помощь.

Сообщение изменено: AgentVlad (04 Ноябрь 2008 - 18:16 )

  • 0

#13 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 04 Ноябрь 2008 - 20:28

Забираю свои слова обратно , был пьян и не мог адекватно оценивать ситуацию! :)
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#14 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 04 Ноябрь 2008 - 21:21

Otacon, отлично! С меня выпивка, фактически в любое время! Большое спасибо!

Был рад помочь :)
  • 0

#15 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 07 Ноябрь 2008 - 12:47

Otacon, Все конечно замечательно! Но возник такой вопрос))

Только не смейтесь!

Вот проделали мы эту всю процедуру.
добавили в таблицу эту переменную.

НО:

Когда мы достаем из таблицы её, получаем как одну большую переменную. Можно её разбить вновь на отдельные переменные?
  • 0

#16 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 07 Ноябрь 2008 - 13:31

AgentVlad, Оф корс :D
// Тут твой код запроса из СЫЛ
$data = "msg1,msg2,msg3,msg4"; // Вот допустим нам вернулась такая строка
$data = explode(',', $data); // Вот разбиваем
print_r($data); // Лицезреем

Всё, можно работать как с обычным массивом

Сообщение изменено: Otacon (07 Ноябрь 2008 - 13:32 )

  • 0

#17 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 07 Ноябрь 2008 - 15:41

Otacon, не, не, не... Я понимаю тебя. Видно я тупо объясняю.
Внесли мы след:

function filter($var)
{
return(!empty($var));
}

$array = array($msg1,$msg2,$msg3,$msg4); // $msg3 не был добавлен так как переменная отсутствовала.
$array = array_filter($array, 'filter');
$data1 = implode(',', $array);

Получилось, что в таблицу с именем table, в столбец data ,была добавлена переменная data1 со значениями msg1,msg2,msg4


Вот смотри.
$result = mysql_query("SELECT * FROM table");
$myrow = mysql_fetch_array($result);
$myrow['data1'] = explode(',', $myrow['data1']); // Вот разбиваем
print_r($myrow['data1']);
// твой вариант, при котором он выводит msg1,msg2,msg4
Если я не ошибаюсь - это равносильно если я напишу <?php echo $myrow['data1']; ?>, да?

А мне надо, чтоб он снова разбил переменную $data1 на $msg1,$msg2,$msg4, a $msg3 вроде как не существует, поэтому её мы опускаем.

Чтоб я мог применить эти переменные в разных местах:

<b>Цена:</b> <?php echo $myrow['msg1']; ?><br>
<b>Место:</b> <?php echo $myrow['msg2']; ?><br>
<b>Срок:</b> <?php echo $myrow['msg4']; ?><br>


Если я коряво объяснил, поправте пожалуйста. Очень признателен за помощь.
  • 0

#18 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 07 Ноябрь 2008 - 16:27

Если я не ошибаюсь - это равносильно если я напишу <?php echo $myrow['data1']; ?>, да?

Это тебе абсолютно ничего не даст :) У тебя просто выведит array() и всё. К тому же, у тебя уже всё сделано. Напиши echo $myrow['data1']['msg1'];
  • 0

#19 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 07 Ноябрь 2008 - 16:38

Undefined index: msg1 in z:\home\adminka\www\view_msg.php on line 66



$result = mysql_query("SELECT * FROM table");
$myrow = mysql_fetch_array($result);
$myrow['data1'] = explode(',', $myrow['data1']); // Вот разбиваем
echo $myrow['data1']['msg1'];

Сообщение изменено: AgentVlad (07 Ноябрь 2008 - 16:39 )

  • 0

#20 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 07 Ноябрь 2008 - 16:43

AgentVlad, Блин ( Вот у меня тупняк то :/ Прошу прощения. echo $myrow['data1'][0];
  • 0

#21 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 07 Ноябрь 2008 - 17:32

Otacon, не сочти меня занудой, просто хочу найти все таки правильное решение моей головной боли:)
$data1 = (кадр1,кадр2,кадр4); // кадр3 отсутсвует, так как не был добавлен, так как пользователь не добавил этот раздел.
ты правильно написал:
$myrow['data1'][0];
$myrow['data1'][1];
$myrow['data1'][2]; и т.д.

НО:

надо сделать так, чтобы
$myrow['data1'][0]; соответствовал $msg1
$myrow['data1'][1]; соответствовал $msg2
$myrow['data1'][2]; соответствовал $msg3
$myrow['data1'][3]; соответствовал $msg4

Можно ли сделать так?
if( $myrow['data1'][0] != "кадр1") {unset($myrow['data1'][0]);}
if( $myrow['data1'][1] != "кадр2") {unset($myrow['data1'][1]);}
if( $myrow['data1'][2] != "кадр3") {unset($myrow['data1'][2]);}
if( $myrow['data1'][3] != "кадр4") {unset($myrow['data1'][3]);}


echo $myrow['data1'][0];
echo $myrow['data1'][1];
echo $myrow['data1'][2];
echo $myrow['data1'][3];


//вот только если какая-то переменная будет отсутствовать, то он выдаст ошибку, что такой переменной нет, можно использовать фильтр, то как?И вообще можно ли так сделать? :)
  • 0

#22 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 07 Ноябрь 2008 - 18:08

$data = 'msg1,msg2,msg3,msg4';
$data = explode(',', $data);
foreach($data as $key=>$value) {
$key++;
eval("\$msg$key = \"$value\";");
}

echo $msg1; // просто перевел их обратно в переменные :) Теперь можно просто вызывать $msg1, $msg2, $msg3, $msg4;
if( !empty($msg1) ) { echo $msg1; }
  • 0

#23 PressSetter

PressSetter

    Крестный Папочка

  • Постоялец
  • 2 263 сообщений
  • Откуда:Таллинн

Отправлено 07 Ноябрь 2008 - 18:49

Otacon, ну че я могу сказать:) Какое пиво любишь?
  • 0

#24 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 07 Ноябрь 2008 - 19:02

AgentVlad, По правде, не пью :D
  • 0

#25 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 09 Ноябрь 2008 - 17:46

$data = 'msg1,msg2,msg3,msg4';
$data = explode(',', $data);
foreach($data as $key=>$value) {
$key++;
eval("\$msg$key = \"$value\";");
}

echo $msg1; // просто перевел их обратно в переменные :) Теперь можно просто вызывать $msg1, $msg2, $msg3, $msg4;
if( !empty($msg1) ) { echo $msg1; }

Что вы тут за велосипед изобрели? :blink: Какой нафиг eval :)
//$data = 'msg1,msg2,msg3,msg4';
//$data = explode(',', $data);
// Заменяется на
$data = array( 'msg1', 'msg2', 'msg3', 'msg4' );

foreach($data as $key=>$value) {
	//$key++;
	//eval("\$msg$key = \"$value\";");
	// Заменяется на
	${$msg . ++$key} = $value;
}

Но суть этого кода я вообще не понял.
  • 0

#26 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 09 Ноябрь 2008 - 19:02

Setor,
1) автору дана строка в виде 'msg1,msg2,msg3,msg4', которую он вернул из сыля =) Так что, понять, как ты смог разделить строку на msg1, msg2, msg3, msg4 без explode я решительно не могу.
2) фигурные скобки в переменных - зло, поэтому evalъ решает :) Хотя этот пункт опция. Просто в падлу писать эти длинные запросы, типо $data['data1'][$n], когда можно превратить в простой $msg$n :)

Сообщение изменено: Otacon (09 Ноябрь 2008 - 19:04 )

  • 0

#27 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 09 Ноябрь 2008 - 20:04

Setor,
1) автору дана строка в виде 'msg1,msg2,msg3,msg4', которую он вернул из сыля =) Так что, понять, как ты смог разделить строку на msg1, msg2, msg3, msg4 без explode я решительно не могу.
2) фигурные скобки в переменных - зло, поэтому evalъ решает :) Хотя этот пункт опция. Просто в падлу писать эти длинные запросы, типо $data['data1'][$n], когда можно превратить в простой $msg$n :)

А, ну тогда сори... просто я почитал первые 5 постов, нифига не понял, какие-то непонятные переменные $msg1, $msg2... видимо, автор сам не понял, что накуралесил :)

А насчёт eval - мой вариант лучше тем, что в нём нет eval. Технически более правильное решение, нет вызова функции. Без eval не обойтись, если генерируется путь к массиву типа $array['a']['b'][1]['c'], когда сам массив ещё не создан (в шаблонизаторе).

Вообще, любое решение является правильным, если оно работает. Всё зависит от поставленной задачи.
  • 0

#28 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 09 Ноябрь 2008 - 20:29

А, ну тогда сори... просто я почитал первые 5 постов, нифига не понял, какие-то непонятные переменные $msg1, $msg2... видимо, автор сам не понял, что накуралесил :)

Ничего, бывает :))

А насчёт eval - мой вариант лучше тем, что в нём нет eval. Технически более правильное решение, нет вызова функции. Без eval не обойтись, если генерируется путь к массиву типа $array['a']['b'][1]['c'], когда сам массив ещё не создан (в шаблонизаторе).

Вполне возможно :) Везде по-разному советуют, вот и думай потом, где правильно :)

Вообще, любое решение является правильным, если оно работает. Всё зависит от поставленной задачи.

+1 :)
  • 0

#29 Vladson

Vladson

    XTGamers.com

  • Постоялец
  • 1 921 сообщений
  • Откуда:Эстония, Таллинн

Отправлено 11 Ноябрь 2008 - 18:07

Вообще, любое решение является правильным, если оно работает

Если оно работая делает то что должно, и НЕ делает того что не должно. (т.е если по совместительству решение кроме основной функции предоставляет услуги бэкдора, то это неправильное решение)
  • 0
Один Владсон может за...ать всех, кроме себя самого. Два Владсона могли бы за...ать абсолютно кого угодно, но Владсон единственный и неповторимый. ©Vladson

Вы либо способны перелопатить тонны информации и отсеять лишнее, либо программистом не будете. ©Psih

Не вазелин, а бизнес-гель ©Avagraen

#30 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 11 Ноябрь 2008 - 20:30

Если оно работая делает то что должно, и НЕ делает того что не должно. (т.е если по совместительству решение кроме основной функции предоставляет услуги бэкдора, то это неправильное решение)

А без этого никак... Опыт приходит со временем, все мы когда-то прошли через подобные велосипеды. Главное - чтобы человек понимал, что практически любое его решение задачи не является идеальным и нужно стремиться к совершенству: читать умные статьи, изучать документацию на фреймворки, пытаться их использовать в своих проектах (хороший фреймворк показывает как пишутся современные веб-приложения, даёт нужное направление). Но прежде всего конечно нужно выучить весь мануал по PHP, пробежаться по списку стандартных функций.

Если же в самом начале взять для себя сложную задачу - написание элементарной гостевухи/блога или CMS'ки, просто забьёшь себе голову, напишешь неправильно, сделаешь кучу багов, будешь кружить по форумам и просить помощи. Кто-то скажет, что это путь большинства начинающих веб-программистов, да - это так и путь этот неверный :)

P.S. адресовано начинающим программистам.
  • 0