В общих чертах: есть база данных. в ней есть 3 таблицы. Первые 2 называются Сотрудники и Проекты. Имеют 2 поля id и name. Третья таблица с 3 полями Имя, Проект и Текст. Необходимо выполнить отсев информации в третьей таблице по имени и вывести название проекта. Для этого используется цикл. Потом необходимо для этого проекта вывести информацию из поля Текст. Это я делаю при помощи второго цикла. Так же есть проверка переменной Проекта длятого, чтобы можно было либо обновить Текст либо при его отсутствии добавить текст в базу.
Проблемма в том, что если вставлять второй цикл вывода текста в первый - тест выводится много раз. а если вставлять вне первого цикла - выводится только первое значение.
Извеняюсь, может как-то не понятно обьясняю. Я только недавно начал поэтому прошу помощи. Кусок кода выкладываю ниже. Буду рад любой критике, предложения по улучшению кода (желательно с подробными обьяснениями) а так же самому решению моей проблеммы:)
/////////////////////////////////////////////////////////////////////////////////////////////////
<php
///////////////////////////////////////////////////////////////////////////////////////
//блок функций
//функция выгрузки из бд
function izbd($param)
{
$link2 = mysql_connect("localhost", "localhost", "localhost") or die("Не могу подключиться" ); // сделать test текущей базой данных
mysql_query( "SET NAMES utf8");
mysql_select_db('localhost', $link2) or die ('Не могу выбрать БД');
return mysql_query($param);
mysql_close($link2);
}
//функция загрузки в бд
function vbd($param)
{
//echo "$param";
$link2 = mysql_connect("localhost", "localhost", "localhost") or die("Не могу подключиться" );
mysql_query( "SET NAMES utf8");
mysql_select_db('localhost', $link2) or die ('Не могу выбрать БД');
mysql_query($param);
mysql_close($link2);
}
///////////////////////////////////////////////////////////////////////////////////////
//переход на сотрудника
{
if ($user_str)
{
$query = "SELECT name FROM sotr WHERE id=$user_str";
$result=izbd($query);
while($r=mysql_fetch_array($result))
{
$name_sotr= $r[name];
}
echo "<br> Вы на страничке сотрудника: <STRONG>$name_sotr</STRONG>";
echo "<br><br> Список проектов: <br>";
if($project_all)
{echo "ID пользователя $user_str";
foreach ( $project_all as $key => $value )
{
$p='';
$query = "SELECT project FROM zadanie WHERE project=$key AND sotr=$user_str";
$result=izbd($query);
while($r=mysql_fetch_array($result))
{
$p=$r[project];
}
If($p)
{
$sql="UPDATE zadanie SET text='$value' WHERE project=$key and sotr=$user_str";
vbd($sql);
}
Else
{
$sql="INSERT INTO zadanie (sotr, project, text) VALUES ('$user_str', '$key', '$value')";
vbd($sql);
}
}
}
//список проектов
{
echo "<form action='$ssil_glav&user_str=$user_str' method='post'>";
echo "<br><table border=0>";
//выбор проектов из таблицы
$query = "SELECT * FROM project order by name";
$result=izbd($query);
while($r=mysql_fetch_array($result))
{
//вывод проектов
$id_project= $r[id];
$name_project= $r[name];
//$user_str id сотрудника
$query_user = "SELECT * FROM zadanie order by sotr";
$result_user=izbd($query_user);
while($r2=mysql_fetch_array($result_user))
{
$id_project_2=$r2[text];
}
echo "<tr>";
echo "<td>";
echo "$name_project" . ": ";
echo "</td>";
echo "<td>";
echo "<textarea name='project_all[$id_project]' cols=40 rows=2></textarea><br><br>";
echo "</td>";
echo "</tr>";
}
echo "</table>";
echo "<input type='submit' value='Сохранить'></form>";
}
echo "<a href='$ssil_glav&str=user&del_user=$user_str'><br>Удалить сотрудника</a>";
}
}
?>
/////////////////////////////////////////////////////////////////////////////////////////////////
Спустя 32 минуты, 21 секунда (3.02.2011 - 10:16) alex12060 написал(а):
function izbd($param)
{
$link2 = mysql_connect("localhost", "localhost", "localhost") or die("Не могу подключиться" ); // сделать test текущей базой данных
mysql_query( "SET NAMES utf8");
mysql_select_db('localhost', $link2) or die ('Не могу выбрать БД');
return mysql_query($param);
mysql_close($link2);
}
И это ты всегда вызываешь этот код? Да тут сервер упадет 1000 раз при использовании этой функции!! Сначала, ты соединяешься к БД (хотя она уже открыта), и выполняешь запрос? Ужас...Ну ладно, это только я 1 код посмотрел, ща еще посмотрю дальше.
while($r=mysql_fetch_array($result))
{
$name_sotr= $r[name];
}
Цикл тут тебе не нужен.
$r2[text]
Массивы, а точнее ассоциации на них обрамляются в одинарный или двойные кавычки.
while($r=mysql_fetch_array($result))
{
//вывод проектов
$id_project= $r[id];
$name_project= $r[name];
//$user_str id сотрудника
$query_user = "SELECT * FROM zadanie order by sotr";
$result_user=izbd($query_user);
while($r2=mysql_fetch_array($result_user))
{
$id_project_2=$r2[text];
}
echo "<tr>";
echo "<td>";
echo "$name_project" . ": ";
echo "</td>";
echo "<td>";
echo "<textarea name='project_all[$id_project]' cols=40 rows=2></textarea><br><br>";
echo "</td>";
echo "</tr>";
}
echo "</table>";
echo "<input type='submit' value='Сохранить'></form>";
}
echo "<a href='$ssil_glav&str=user&del_user=$user_str'><br>Удалить сотрудника</a>";
}
}
А здесь ты просишь запрос-ответ к БД с кол-вом итераций цикла, т.е. если у тебя будет 1000 проектов, 1000 раз ты запросишь одно и то же!!
Спустя 18 минут, 1 секунда (3.02.2011 - 10:34) alex12060 написал(а):
А так, пока въехать не могу, именно как надо и по каким критериям.
Спустя 1 минута, 45 секунд (3.02.2011 - 10:35) Zerstoren написал(а):
Мдамс.
Открывать соединение нужно только при необходимости и закрывать только тогда когда тебе уже оно точно не потребуется.
Лучше всего использовать класс в котором буде __construct и __destruct
И подрубать егоможно нужно на глобальном уровне.
Открывать соединение нужно только при необходимости и закрывать только тогда когда тебе уже оно точно не потребуется.
Лучше всего использовать класс в котором буде __construct и __destruct
И подрубать его
Спустя 7 минут, 51 секунда (3.02.2011 - 10:43) Satellite написал(а):
ммм... до классов еще не добрался. мне бы на уровне обращений в базу и циклов сделать...
2alex12060, вот смотри. необходимо например показать проекты Сергея. база ищет Сергей в таблице и выводит только его проекты. Далее рядом в форме необходимо вывести тест из поля Текст в таблице. Необходимо чтобы текст можно было поменять и сохранить. и чтобы при следующем открытии показывался сразу сохранненый текст
2alex12060, вот смотри. необходимо например показать проекты Сергея. база ищет Сергей в таблице и выводит только его проекты. Далее рядом в форме необходимо вывести тест из поля Текст в таблице. Необходимо чтобы текст можно было поменять и сохранить. и чтобы при следующем открытии показывался сразу сохранненый текст