Няколко прости питания за БД...

sizif

Registered
Здравейте!

Имам няколко съвсем основни въпроса относно работа с БД:

1) каква е комадата за изтриване на ред от таблица, а също и за изтриване на таблица?
(със записа и листването вече се оправям, търсих статии тук и на други места но не открих)

2) как мога да запазя параграфите при записване на низ, извлечен от текстово поле на форма? (досега позлвах или таг <pre> или функцията nl2br(); след ехо, но ги ползвах за листване на запис от файл, а с БД не е много удобно. Някъде тук бях чел за използването на nl2br(); при самия запис на низа - интересува ме синтаксиса, но не можах да открия темата. Освен това, има ли значение дали е зададена и каква е стойността на WRAP="" във формата (тесктовото поле)?

Благодаря предварително!
 
1)за изтриване на цяла таблица
$query="DROP table `name`";
за изтриване на ред се използва
$query = "DELETE FROM таблица WHERE id='$id' LIMIT 1 ";

2)точно немога да ти отговоря но ако искаш да запазиш параграфите при текстовото поле изпилзваш функцията nl2br()
примерно
$text=$_POST['textarea'];
$text=nl2br($text);
и след това записваш в БД
 
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query ="DELETE FROM table WHERE id='1' ";
mysql_query($query);
mysql_close();

Горното трие поле с id 1.

Пример:

Ако имаш таблица за обяви с имена на полетата:
id zaglavie user text data

с 1 милион записа в нея.


Искаш да изтриеш всички обяви, които са написани от потребител sizif .

mysql_connect(localhost,$user,$password);
mysql_select_db($database) ;
$query ="DELETE FROM obqvi WHERE user='sizif' ";
mysql_query($query);
mysql_close();


До тук добре.

Може да искаш да изтриеш всички записи на потребителя sizif
които са написани на дата 05.10.06 .

mysql_connect(localhost,$user,$password);
mysql_select_db($database) ;

$query ="DELETE FROM obqvi WHERE user='sizif' and data='05.10.06' ";

mysql_query($query);
mysql_close();

Ако искаш да изтриеш всичките записи на потребител sizif написани на дата 05.10.06 но в заглавието да присъства буквата L .


mysql_connect(localhost,$user,$password);
mysql_select_db($database) ;

$query ="DELETE FROM obqvi WHERE user='sizif' and data='05.10.06' and zaglavie like '%l%' ";

mysql_query($query);
mysql_close();


Ако искаш да изтриеш всичките записи на потребител sizif написани на дата 05.10.06 но заглавието да започва с ТЕСТ



mysql_connect(localhost,$user,$password);
mysql_select_db($database) ;

$query ="DELETE FROM obqvi WHERE user='sizif' and data='05.10.06' and zaglavie like 'тест%' ";

mysql_query($query);
mysql_close();


Ако искаш да изтриеш всичките записи на потребител sizif написани на дата 05.10.06 а заглавието им започва с ТЕСТ .
Ако не са изпълнени тези условия да провери в текста дали няма
думата php и ако има да изтрие записа.



mysql_connect(localhost,$user,$password);
mysql_select_db($database) ;

$query ="DELETE FROM obqvi WHERE ( user='sizif' and data='05.10.06' and zaglavie like 'тест%') or text like '%php%' ";

mysql_query($query);


и т.н. до безкрай.
mysql_close();
 
Здравейте!

Много благодаря за отговорите и на двама ви! Ще пробвам да напиша код по тях.

Успешен ден/нощ!
 
Здравейте!

Имам още няколко въпроса, помествам ги тук, защото отново касаят БД.

Интересува ме как мога да пренареждам редовете в таблица. Например, ако имам следната таблица:

id | zaglavie | user | text | data |
1 |
2 |
3 |


и решавам, че искам да сменя подреждането на записите и то да стане да речем 2,1,3. Има ли някаква специална функция за това?

А също, как мога да вмъкна ред в таблицата, но той да не отива най-отдолу, а между старите записи. В този пример, ред 4 да се запише между 1 и 2.

Предполагам, че бих могъл да реша този проблем при самото листване (създавам нов масив от този, който ми връща БД-то), но алгоритъмът ми се струва прекалено сложен.

Ако е възможно, има ли значение дали полето се попълва автоматично от БД или се въвежда по друг начин?

Това питане е свързано и с изтриването на ред, тъй като се оказа, че ако изтрия ред и след това направя нов запис, той попада на мястото на изтрития ред (макар номера му наистина да е с 1 по-голям от последния) и когато ми връща отговор на заявката да листне цялото съдържание на таблицата, вместо извеждане на записите в хронология (1, 2, /3-изтрит/ 4, 5, 6 и т.н) се появява каша (1, 2, 5, 4, 6...) :(

Вторият ми въпрос е има ли функция, с която мога да получа да речем последните 10 записа в таблицата? Предполагам, че мога да го направя с цикъл при листването (условие $i<10), но все ми се струва, че твърде много разсъждавам така сякаш работя с файлове :(

Ако съществува такава функция, как бих могъл да я накарам да вземе десет последователни ред от произволно избрано място. Примерна зявка: върни ми 10 последователни реда след 12 запис, или записи 13-23.

Тук веднага ми хрумва, а как да направя така, че ако няма толкова редове, колкото искам да върне, да не ми изпише грешка (винаги мога да я подтисна с @)? Т.е. да направя проверка за наличните редове в таблицата?

И последен въпрос: как да подам заявка да ми върне само една колона от таблицата (да речем всички записи в колона zaglavie), а не цялото съдържание и от него при листване да вадя само заглавията? т.е. да ми върне обикновен масив само със заглавията, а не двумерен?

Не ми е проблем да обработя двумерния масив и да листна, който и да е елемент в него, но това пак ми навява усещането, че работя с файл (само дето не ползвам експлоуд(); ), а от примерите за триенето оставам с впечатлението, че пак правя нещата по трудния начин...

Ако въпросите ми ви се струват твърде объркани, ще се опитам да ги пусна по-конкретни.

Благодаря предварително!
 
sizif каза:
Здравейте!

Имам още няколко въпроса, помествам ги тук, защото отново касаят БД.

Интересува ме как мога да пренареждам редовете в таблица. Например, ако имам следната таблица:

id | zaglavie | user | text | data |
1 |
2 |
3 |


и решавам, че искам да сменя подреждането на записите и то да стане да речем 2,1,3. Има ли някаква специална функция за това?

А също, как мога да вмъкна ред в таблицата, но той да не отива най-отдолу, а между старите записи. В този пример, ред 4 да се запише между 1 и 2.

Предполагам, че бих могъл да реша този проблем при самото листване (създавам нов масив от този, който ми връща БД-то), но алгоритъмът ми се струва прекалено сложен.

Ако е възможно, има ли значение дали полето се попълва автоматично от БД или се въвежда по друг начин?

Това питане е свързано и с изтриването на ред, тъй като се оказа, че ако изтрия ред и след това направя нов запис, той попада на мястото на изтрития ред (макар номера му наистина да е с 1 по-голям от последния) и когато ми връща отговор на заявката да листне цялото съдържание на таблицата, вместо извеждане на записите в хронология (1, 2, /3-изтрит/ 4, 5, 6 и т.н) се появява каша (1, 2, 5, 4, 6...) :(
select * from tablica ORDER BY id ASC;
ако заместиш asc с desc, ще ти ги изкара в обратен ред
sizif каза:
Вторият ми въпрос е има ли функция, с която мога да получа да речем последните 10 записа в таблицата? Предполагам, че мога да го направя с цикъл при листването (условие $i<10), но все ми се струва, че твърде много разсъждавам така сякаш работя с файлове :(
select * from таблица order by id desc LIMIT 0,10;
последните 10 реда
с първата цифра на лимит задаваш от кой ред започне, с втората - до кой ред да чете. Ако смениш desc със asc ще ти прочете първите 10 реда
ако напишеш asc limit 5, 10 ще ти прочете от 5-ти до 10-ти ред
sizif каза:
Ако съществува такава функция, как бих могъл да я накарам да вземе десет последователни ред от произволно избрано място. Примерна зявка: върни ми 10 последователни реда след 12 запис, или записи 13-23.
$query = "select * from таблица order by id desc LIMIT ".$from.",".$end;
$from = 'от реда който искаш да започне ';
$end = ' до реда до който искаш да прочетеш';
sizif каза:
Тук веднага ми хрумва, а как да направя така, че ако няма толкова редове, колкото искам да върне, да не ми изпише грешка (винаги мога да я подтисна с @)? Т.е. да направя проверка за наличните редове в таблицата?
най-лесно е с while цикъла, като поставяш масива в условието. Така цикъла се изпълнява докато има редов в масива:
while ($row = mysql_fetch_array($result)) {
$id = $row['id'];
}

sizif каза:
И последен въпрос: как да подам заявка да ми върне само една колона от таблицата (да речем всички записи в колона zaglavie), а не цялото съдържание и от него при листване да вадя само заглавията? т.е. да ми върне обикновен масив само със заглавията, а не двумерен?
select id, zaglavie from tablicata;
селектва ти само тези две колонки. Когато не ти трябват всички колонки е за предпочитане да описваш в селекта само тези, които ще ползваш.
sizif каза:
Не ми е проблем да обработя двумерния масив и да листна, който и да е елемент в него, но това пак ми навява усещането, че работя с файл (само дето не ползвам експлоуд(); ), а от примерите за триенето оставам с впечатлението, че пак правя нещата по трудния начин...

Ако въпросите ми ви се струват твърде объркани, ще се опитам да ги пусна по-конкретни.

Благодаря предварително!

първите два въпроса друг път ще ти обясня, че вече ми се изтегли филма ;)
 
Здравей!

Благодаря за отговорите, макар че мисля си: струваше ли си да прекъсваш хубавите обяснения с тоя филм? ;)
А иначе успя да ме убедиш, че правя нещата по трудния начин, което е достоен повод за размисъл :)
 
sizif каза:
Здравей!

Благодаря за отговорите, макар че мисля си: струваше ли си да прекъсваш хубавите обяснения с тоя филм? ;)
А иначе успя да ме убедиш, че правя нещата по трудния начин, което е достоен повод за размисъл :)

не съм го прекъсвал, когато се логнах, още не се беше изтеглил ;)

и решавам, че искам да сменя подреждането на записите и то да стане да речем 2,1,3. Има ли някаква специална функция за това?
Не знам за специална функция и се съмнявам да има :)
Освен да добавиш допълнителна колонка с цифри в нея и да сортираш по нея не знам по какъв дръг начин може да стане. Питах и приятел, но и той това предлага.
ако имаш тази таблица:
ид |sort|danni
1 | 1 | баба
2 | 2 | дядо
3 | 3 | татко
5 | 7 | лелята
6 | 6 | мама
7 | 4 | любовница
като ги сортираш по колоната "sort" излизат в следния ред:
ид|sort|danni
1 | 1 | баба
2 | 2 | дядо
3 | 3 | татко
7 | 4 | любовница
6 | 6 | мама
5 | 7 | лелята
Примерно искаш да "мама" да излиза преди "любовница"
Както знаеш? Знаеш ИД-то и sort на мама.
$ид_мама = 6
$сорт_мама = 6
Трябва да разбереш ИД-то и sort на предния ред (може да не е предната сифра, ако са изтривани редове от базата):
select id, sort from таблицата where pid < $сорт_мама order by sort desc limit 1;
$ид_любовница = 7
$сорт_любовница = 4
update таблицата set sort = '$сорт_мама' where id = '$ид_любовница';
update таблицата set sort = '$сорт_любовница' where id = '$ид_мама';

баси колко заявки станаха... някой да има по умна идея?
 
sizif ...
Мога да помогна но ти задаваш по 10 въпроса на веднъж. :)

Немоа да ги прочета толкова много думи и да запомнвя всичко.

Сега ще прочета внимателно и ще ти отговоря.
 
Само тук не съм съгласен:


slavei каза:
sizif каза:
Тук веднага ми хрумва, а как да направя така, че ако няма толкова редове, колкото искам да върне, да не ми изпише грешка (винаги мога да я подтисна с @)? Т.е. да направя проверка за наличните редове в таблицата?

най-лесно е с while цикъла, като поставяш масива в условието. Така цикъла се изпълнява докато има редов в масива:
while ($row = mysql_fetch_array($result)) {
$id = $row['id'];
}

Ще стане мазало ако броиш в таблица с 300000 реда както е в webagent-a.

АКо искаш да преброиш редове в една таблица може да го направиш така:


$query="SELECT id from table";
$result=mysql_query($query);
$broi=mysql_num_rows($result);

това ще работи бързо и при 2000000 реда.

Забележи, че не е :
$query="SELECT* from table";


Може и така:

$query = "SELECT COUNT(id) AS numrows FROM table";
$result = mysql_query($query) ;
$row = mysql_fetch_array($result);
$broi = $row['numrows'];
 
Много, много благодаря!!!

За пренареждането на редовете в таблицата питах специално, защото се опитвам да направя така, че потребителят да може да трие и да добавя нови раздели към страницата си. А за да бъде една такава опция пълноценна се нуждая от алгоритъм, по който да може да се пренареждат елементите в менюто след актуализацията без да се губят и връзките към съдържанието. В таблицата която използвам елементите на менюто се записват на един ред със съдържанието...

id | data | element_ot_meniuto | sydyrvanie na razdela |
1 | --- | HOME | Съдържанието на първата стр|

и пр.
После давам заявка на Бд да ми покаже цялото съдържание на таблицата и попълвам последователно с цикъл <А HREF="index.php?id=$id"> $element_ot_meniuto</A>

За определяне на съдържанието ползвам стойността на $id, предадена чрез връзката и т.н.

Ако се сещате за по-опростен начин, ще ми помогнете много :)

Страницата, която правя поне формално е комерсиална. Отдавна съм надскочил уговорката ми с поръчителя (бивша приятелка, която даже не знае какво да иска), но ми се ще с БД да надскоча онова, което мога да правя с файлове, а с тях уви, продължавам да мога повече :(
 
несъм чел предните постове и несъм сигорен дали съм разбрал това което искаш да направиш
искаш менюто да е динамично т.е. да може ди да определящ кои елемент от менюто да е 1.2.3. и тнт
защо не добавиш още едно поле в към таблицата ( примерно podredba) в което да записваш на кое място да ти е дадения елемет от менуто както е в повечето ЦМС
примерно
1 Начало
2 Уроци
3 Форум
и след което сортираш елементите по новото поле podredba
 
Аз не разбрах за пренареждането .
Как искаш да ги подредиш?
Има ли някакво демо да видя?
По какво се определя подреждането?
Ако ми кажеш някакъв критетии по който ще се подреждат ще ти дам и заявката.
 
Демо е малко силно казано. :( Ето тук съм направил да се редактират името на раздела /онова, което ще излезе като препратка в менюто/, заглавието и съдържанието:

http://tntm.org/probna_3/edit_menu.php

За момента добавяне на нов раздел или изтриване нямам, защото направих каша в таблицата, когато се опитах да трия. Проблема го описах по-горе: листвам в последователност, а когато има изтрит ред и нов запис, той постъпва на мястото на изтрития ред, нищо че поредният му номер е друг...

Иначе предавам с урл-кодиране номера на id-то и по него листвам...

Искам, както mute отбелязва, потребителя да може да пренарежда менюто:

1 Начална
2 Проекти
3 Клиенти

да стане например:

1 Проекти
2 Начална
3 Клиенти

без да губя съответното id на името.

Сега съм гроги и ми е трудно да се изразявам, утре ще се постарая да дам по-понятни обянснния :)
Иначе благодаря за вниманието към темата! Много ми помагате дори когато ми казвате неща, които не съм се сетил да питам. Всъщност, често не знам какво да питам, а така получавам допълнителна информация.
 
Чакай, че чак сега се сетих, че мога да погледна. :)

$query="SELECT * FROM sydyrzhanie order by id";


така ще ги подредиш по id . :wink:
 
Кода на трите файла, който актуализират информацията:

edit_menu.php

<BR><B>Redkatiraj stranicata:</B>
<BR>

<?
$user="***";
$password="***";
$database="***";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$chars="SET CHARACTER SET cp1251";mysql_query($chars);

$query="SELECT * FROM sydyrzhanie";
$result=mysql_query($query)
or die ("Zaqwkata ne mozhe da se izpylni!");

while ($row = mysql_fetch_array($result))
{

$id=$row["id"];
$name=$row["name"];
echo <<< GAN
<BR><A HREF="edit.php?id=$id">$name</A>
GAN;

}


mysql_close();
?>


edit.php

<html>
<body>
<form name="" method="Post" action="update.php">

<?
$user="tntmorg_gan";
$password="ganpass";
$database="tntmorg_test";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$chars="SET CHARACTER SET cp1251";mysql_query($chars);

$query="SELECT * FROM sydyrzhanie WHERE id='$id'";

$result=mysql_query($query)
or die ("Zaqvkata ne mozhe da se izpylni");

If($row = mysql_fetch_array($result))
{
echo "Data: ";
echo $row["data"];
echo "<br>";

echo "Razdel: ";
$name=$row["name"];
echo <<< GAN
<INPUT TYPE="TEXT" NAME="name" VALUE="$name" size="100" maxlenght=100><BR>
GAN;

echo "Zaglavie: ";
$zaglavie=$row["zaglavie"];
echo <<< GAN
<INPUT TYPE="TEXT" NAME="zaglavie" VALUE="$zaglavie" size="100" maxlenght=100>
GAN;

echo "<BR>Sydyrzhanie: ";
$text2=$row["text2"];
echo <<< GAN
<TEXTAREA ROWS="5" COLS="60" NAME="text2" WRAP="virtual">$text2</TEXTAREA>
GAN;

$id=$row["id"];
echo <<< GAN
<BR><input type="hidden" name="id" value="$id">
<input type="submit" name="Submit" value="Izprati!">
GAN;
}


mysql_close();
?>

</body>
</html>

и update.php

<?
$user="***";
$password="***";
$database="***";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$chars="SET CHARACTER SET cp1251";mysql_query($chars);

$data=date('H:i-d.m.y');

$query = "Update sydyrzhanie SET data='$data', name='$name', zaglavie='$zaglavie', text2='$text2' Where id='$id'";

echo "<BR>$name";
echo "<BR>$zaglavie<BR>";
echo nl2br($text2);


$result=mysql_query($query)
or die ("Zaqvkta ne mozhe da se izpylni!");

echo "<BR><BR>Zapisyt e obnowen uspeshno!";

mysql_close();
?>

ДА :))

В хтмл_публик/пробна_3
 
ето как ще стане и с изтриване на ред:
delete.php


<?
$id = $_GET['id'];
$user="***";
$password="***";
$database="***";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");

$query="DELETE FROM sydyrzhanie WHERE id = '$id'";

$result=mysql_query($query)

or die ("Zaqwkata ne mozhe da se izpylni!");

mysql_close();
?>
:wink:
 
Да, вече зная, как се трие ред, но все пак благодаря :)

Проблема ми беше, че като изтрия ред и направя нов запис, той заема мястото на изтрития ред в таблицата и става нещо такова:

id:

1
2

3
- изтривам реда с ид 3, който до момента си е на трето място и в самата таблица
4

id:

1
2

5 - новия запис, с ид 5 попада в таблицата на мястото на три.
4


Така ако листвам всички редове, а не по ключ, става каша :(
Доста идеи получих снощи по този проблем, а и по други, но едва сега сядам пред компютъра и ще ги пробвам.

Благодаря на всички, които взехте отношение по темата!
 

Горе