[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обращение в базу и вывод из базы
Satellite
Доброго времени суток. Я только недавно начал писать на php. Пишу сейчас модуль для joomla.
В общих чертах: есть база данных. в ней есть 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

И подрубать его можно нужно на глобальном уровне.

Спустя 7 минут, 51 секунда (3.02.2011 - 10:43) Satellite написал(а):
ммм... до классов еще не добрался. мне бы на уровне обращений в базу и циклов сделать...

2alex12060, вот смотри. необходимо например показать проекты Сергея. база ищет Сергей в таблице и выводит только его проекты. Далее рядом в форме необходимо вывести тест из поля Текст в таблице. Необходимо чтобы текст можно было поменять и сохранить. и чтобы при следующем открытии показывался сразу сохранненый текст
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.