Jump to content
greg505

[mysql] Zmienna

Recommended Posts

mam tablele w ktorej jest wiersz Nr_indesku

wpisywany jest do niej (jak nazwa wskauje ;) ) nr indeksu

 

uzylem char (5)

czyli dluzszego stringu niz 5 znakow wpisac nie mozna

 

a jak ograniczyc to od dolu, zeby musialo byc podane dokladnie 5 znakow?

 

alter table studenci modify Nr_Indeksu char (5) not null;

Share this post


Link to post
Share on other sites

Z tego co mi wiadomo MySQL jeszcze nie oferuje constraint'ow na tym poziomie, wiec musisz sie o to zatroszczyc na poziomie aplikacji.

 

Swoja droga.. przechowywanie numeru w zmiennej znakowej.. nie sadzisz, ze nienaturalnie? :)

Edited by FiDO

Share this post


Link to post
Share on other sites

Swoja droga.. przechowywanie numeru w zmiennej znakowej.. nie sadzisz, ze nienaturalnie? :)

Wiesz FiDO. Może zawiera literki numer indeksu? A może robi to dlatego bo go tak uczyli/zmusili. Wyobraź sobie że byłem na lekcji raz i widziałem jak jakiś hardy praktykant miał lekcję o ACCESie. Do dzisiaj pamiętam jak krzyczał po uczniach że że numer telefonu(czy było to coś innego, nie pamietam) należy robić jako zmienna znakową, bo jak (prawie wrecz) krzyczał do jednej dziewczyny: Nie będziesz przecież tego dodawała ani odejmowała. Żenua to było...

Share this post


Link to post
Share on other sites

Dokładnie, jak radzi FiDO, lepiej to zrobić na poziomie aplikacji. A jak już będziesz sprawdzał, to możesz widełki z obu stron zastosować. Podobnie z pozostałymi zmiennymi. Najlepiej sprawdzać cały formularz na raz. No i oczywiście wszystko na funkcjach, ale o tym chyba już wiesz. :]

 

Co do numeru to też racja - lepiej zmienna liczbowa. Np 1000 w zmiennej liczbowej to 2 bajty, a w char już 3. Chyba jakoś tak to było...

-edit-

Jak są litery, to już odpada.

Share this post


Link to post
Share on other sites

Co do numeru to też racja - lepiej zmienna liczbowa. Np 1000 w zmiennej liczbowej to 2 bajty, a w char już 3. Chyba jakoś tak to było...

Juz nawet nie chodzi o rozmiar tego w bazie (chociaz bedzie on faktycznie mniejszy), pola liczbowe sa ogolnie wydajniejsze i jesli cos sie da tak zapisac to powinno sie z tego korzystac. Jakis indeksik na takie pole i wyszukiwanie od razu staje sie szybsze (indeksy na polach liczbowych tez sa mniejsze i raczej wydajniejsze). No ale jesli sa tam literki to nic z tego..

 

Wyobraź sobie że byłem na lekcji raz i widziałem jak jakiś hardy praktykant miał lekcję o ACCESie. Do dzisiaj pamiętam jak krzyczał po uczniach że że numer telefonu(czy było to coś innego, nie pamietam) należy robić jako zmienna znakową, bo jak (prawie wrecz) krzyczał do jednej dziewczyny: Nie będziesz przecież tego dodawała ani odejmowała. Żenua to było...

To, ze tak sie zdarza w szkole to jeszcze pikus.. tez na studiach mielismy paru takich agentow co to zawsze mieli racje. Ale akurat kolesie od baz byli calkiem wporzo i wiekszosc tego co mowili zgadzalo sie z ogolnie przyjetymi zasadami.

Gorsze, ze tacy sa rowniez w powaznych firmach... Pracuje teraz przy jednym projekcie we wspolpracy z pewna zagraniczna firma i dawno nie widzialem takich klapek na oczach jak oni maja. W calej firmie jest jeden rozsadny koles, ktory (jak sie dowiedzielismy dopiero niedawno) probowal przeforsowac duza czesc z tych rzeczy, ktore my probujemy, ale mu sie nie udalo "bo nie" :) Nierzadko zdarza sie, ze leja na ogolnie przyjete zasady, ktore stosuje sie w roznych sprawach, ale co sie mozna przy tym nauczyc cierpliwosci i tolerancji to nasze i nie oddamy :]

Share this post


Link to post
Share on other sites

Nie bede zakladac nowego tematu, wiec pisze tu ;]

 

mam skrypcik ktory dodaje dane do tabeli

 

(nie dziala znacznik

 )  <_< 
[html]<?php $imie = $_POST['imie'];
$nazwisko = $_POST['nazwisko'];
$nr_indeksu = $_POST['nr_indeksu'];

if($imie and $nazwisko and $nr_indeksu) {

$connection = @mysql_connect('127.0.0.1', 'root', 'greg')
or die('Brak połączenia z serwerem MySQL');
$db = @mysql_select_db('zapisy', $connection)
or die('Nie mogę połączyć się z bazą danych');


$ins = @mysql_query("INSERT INTO studenci SET imie='$imie', nazwisko='$nazwisko', nr_indeksu='$nr_indeksu'");

if($ins) echo "Rekord został dodany poprawnie";
else echo "Błąd nie udało się dodać nowego rekordu";

mysql_close($connection);
}

?>[/html]

 

wpisuje dane do formularza

i wysylam

[html]<input type="submit" value="Wyslij" name="send">[/html]

 

w innym miejscu strony mam wywietlane dane z tabeli studenci

wszystko bylo by ok, ale....

 

dane na stronie sa aktualizowane dopiero po odswiezeniu,

ale w momencie odswiezenia formularz jest wysylany ponownie i wpisy sa powtarzane :-|

jak temu zapobiec?

Edited by greg505

Share this post


Link to post
Share on other sites

w innym miejscu strony mam wywietlane dane z tabeli studenci

wszystko bylo by ok, ale....

dane na stronie sa aktualizowane dopiero po odswiezeniu,

Tzn. że po wciśnięciu submita strona nie jest ładowana od początku ?

Share this post


Link to post
Share on other sites

wlasnie tak jest ;]

zaraz zmienie i przetestuje ;)

 

czemu nie dziala znacznik

?



edit:
jak zwykle miales racje ;)

ale jak zablokowac ponowne wysylanie formularza (po odwierzeniu dodaje caly czas ten sam wpis)

kolenjny edit:
wystarczy dodac:
[html]if($ins) echo "<meta http-equiv=\"refresh\" content=\"0;URL=strona_z_formularzem.php\">";[/html]

Edited by greg505

Share this post


Link to post
Share on other sites

dopiero co zaczynam z php wiec stad moje pytanie

 

jak zrobic zeby nawiazac polaczenie z baza tylko w jednym miejscu w kodzie?

 

teraz to wyglada tak ze w kazdym miejscu gdzie jest mi potrzebne odwolanie do bazy mysql, wpisuje dane serwera, logi, haslo i nazwe bazy (domyslam sie ze nie jest to zbyt efektywne rozwiazanie)

 

zrobic plik php ktory bedzie nawiazywac polaczenie z baza i odwolywac sie do niego w kodzie?

cze moze jakos inaczej?

Share this post


Link to post
Share on other sites

Na jedne podstronie wystarczy ze raz sie połączysz z bazą zeby móc z niej dalej korzystac. Wystarczy ze na początku sie połączysz i na samym koncu po wykonaniu wszystkich operacji na bazie zamkniesz połaczenie. Nie wiem w jaki sposób tworzysz strone, ale jesli są to osobne pliki php to zapisz w osobnym pliku i dołącz do kazdego np. przez include zeby nie powtarzac kodu. Jezeli ładujesz podstrony przez parametry do strony głownej to w ogóle wystarczy sie połaczyc tylko raz.

Share this post


Link to post
Share on other sites

dopiero co zaczynam z php wiec stad moje pytanie

 

jak zrobic zeby nawiazac polaczenie z baza tylko w jednym miejscu w kodzie?

 

teraz to wyglada tak ze w kazdym miejscu gdzie jest mi potrzebne odwolanie do bazy mysql, wpisuje dane serwera, logi, haslo i nazwe bazy (domyslam sie ze nie jest to zbyt efektywne rozwiazanie)

 

zrobic plik php ktory bedzie nawiazywac polaczenie z baza i odwolywac sie do niego w kodzie?

cze moze jakos inaczej?

 

Zainteresuj sie klasą MyActiveRecord - piekna rzecz i skroci twoje meczarnie z SQLem o 90%

Share this post


Link to post
Share on other sites

juz wczeniej to probowalem i nie chcialo dzialac EDIT: musialem cos zrobic zle ;] teraz strona na serwerze smiga kilka razy szybciej

 

 

.......

tu wrzucam kod jak to wyglada(dzialajace)

 

wszystkie uwagi (a domyslam sie ze tego bedzie sporo :wink: ) mile widziane

» Naciśnij, żeby pokazać/ukryć tekst oznaczony jako spoiler... «

<html>

<head>

<meta http-equiv="Content-type" content="text/html; charset=utf-8">

</head>
<body>


<br><br><br>




<br><br><br><br>
<p align = "center">
FORMULARZ DODAWANIA STUDENTOW
</p>


<form method="POST" action="">
<div align="center">

<table border="1" width="50%" cellspacing="0" cellpadding="0">
<tr>
<td width="50%"><font size="2" face="Verdana"> Imie <font></td>
<td width="50%" align="center"><font size="2" face="Verdana">
	<input type="text" name="imie" size="20">
</font></td>
</tr>

<tr>
<td width="50%"><font size="2" face="Verdana"> Nazwisko </font></td>
<td width="50%" align="center"><font size="2" face="Verdana">
	<input type="text" name="nazwisko" size="20">
</font></td>
</tr>

<tr>
<td width="50%"><font size="2" face="Verdana"> Numer indeksu </font></td>
<td width="50%" align="center"><font size="2" face="Verdana">
	<input type="text" name="nr_indeksu" size="20">
</font></td>
</tr>

<tr>
<td width="50%"><font size="2" face="Verdana"> przedmiot </font></td>
<td width="50%" align="center"><font size="2" face="Verdana">
	<input type="text" name="przedmioty" size="20">
</font></td>
</tr>

<tr>
<td width="100%" colspan="2">
<p align="center"><font size="2" face="Verdana">
	<input type="submit" value="Wyslij" name="send"><input type="reset" value="Kasuj">
</font></td>
</tr>

</table>
</div>
</form>


<?php 
// odbieramy dane z formularza 
$imie = $_POST['imie']; 
$nazwisko = $_POST['nazwisko']; 
$nr_indeksu = $_POST['nr_indeksu']; 
$przedmioty = $_POST['przedmioty']; 

if($imie and $nazwisko and $nr_indeksu) { 

// łączymy się z bazą danych 

	$connection = @mysql_connect('127.0.0.1', 'root', 'greg') 
		or die('Brak połączenia z serwerem MySQL'); 
	$db = @mysql_select_db('zapisy', $connection) 
		or die('Nie mogę połączyć się z bazą danych'); 

// dodajemy rekord do bazy 


$ins = @mysql_query("INSERT INTO studenci SET imie='$imie', nazwisko='$nazwisko', nr_indeksu='$nr_indeksu'"); 

$ins2 = @mysql_query("INSERT INTO kursy SET przedmioty='$przedmioty'");

	if($ins) {
		echo "Rekord został dodany poprawnie do tabeli studenci
		<meta http-equiv=\"refresh\" content=\"0;URL=zapisy1.php\">"; 
	}
	else echo "Błąd nie udało się dodać nowego rekordu"; 

	if($ins2) {
		echo "Rekord został dodany poprawnie do tabeli kursy
		<meta http-equiv=\"refresh\" content=\"0;URL=zapisy1.php\">"; 
	}
	else echo "Błąd nie udało się dodać nowego rekordu"; 



   mysql_close($connection); 
} 


//KONIEC FORMULARZA DODAWANIA STUDENTOW
?>







<br><br><br><hr>

<?php 
//TABELA ZAPISY


// łączymy się z bazą danych
 $connection = @mysql_connect('127.0.0.1', root, greg)         
		or die('Brak połączenia z serwerem MySQL.<br />Błąd: '.mysql_error());
	echo "Udało się połączyć z serwerem!<br />"; 

	$db = @mysql_select_db('zapisy', $connection) 
		or die('Nie mogę połączyć się z bazą danych<br />Błąd: '.mysql_error()); 
	echo "Udało się połączyć z bazą dancych!"; 


$query="SELECT * FROM zapisy";
$result=mysql_query($query);

$num=mysql_numrows($result);

mysql_close($connection); 


echo "<b><center>Struktura bazy danych</center></b><br><br>";


$i=0;


echo "
<p align = center>
TABELA ZAPISY
</p>

<div align=center>

<table border = 2>
<tr>
<td width = 100px align = center>id_kursy</td>
<td width = 100px align = center>id_studenci</td>
<td width = 100px align = center>id_wykladowcy</td>
<td width = 100px align = center>id_sala</td>
</tr>
</table>
";


while ($i < $num) {


$id_kursy=mysql_result($result,$i,"id_kursy");
$id_studenci=mysql_result($result,$i,"id_studenci");
$id_wykladowcy=mysql_result($result,$i,"id_wykladowcy");
$id_sala=mysql_result($result,$i,"id_sala");


echo "
<table border = 2>

<tr>
<td width = 100px align = center>$id_kursy</td>
<td width = 100px align = center>$id_studenci</td>
<td width = 100px align = center>$id_wykladowcy</td>
<td width = 100px align = center>$id_sala<td>
</tr> 
</table>
";

$i++;
}

?>

<br><br><hr>





<?php 
// TABELA STUDENCI

$connection = @mysql_connect('127.0.0.1', root, greg)         
	or die('Brak połączenia z serwerem MySQL.<br />Błąd: '.mysql_error());
$db = @mysql_select_db('zapisy', $connection) 
	or die('Nie mogę połączyć się z bazą danych<br />Błąd: '.mysql_error()); 


$pytanko=mysql_query("select * from studenci");


echo "
TABELA studenci

<table border = 2>
<tr>
<td width = 20px align = center>id</td>
<td width = 100px align = center>nazwisko</td>
<td width = 100px align = center>imie</td>
<td width = 100px align = center>nr_indeksu</td>
<td width = 50px align = center>kasuj</td>
</tr>
</table>
";



while ($wiersz=mysql_fetch_array($pytanko))	{

$wpis = $wiersz['id'];

       echo "<table border='1'>
      <tr> 
        <td width = 20px align = center>".$wiersz['id']."</td> 
       	<td width = 100px align = center>".$wiersz['nazwisko']."</td> 
        <td width = 100px align = center>".$wiersz['imie']."</td> 
       	<td width = 100px align = center >".$wiersz['nr_indeksu']."</td> 
	<td td width = 50px align = center >
		<b><a href='del.php?iddel=".$wpis." '>KASUJ</a></b>
	</td>
      </tr>
      </table>
";
}


mysql_close($connection);

// KONIEC TABELA STUDENCI


?>



<br><br><hr>





<?php 
//   TABELA KURSY


$connection = @mysql_connect('127.0.0.1', root, greg)         
	or die('Brak połączenia z serwerem MySQL.<br />Błąd: '.mysql_error());
$db = @mysql_select_db('zapisy', $connection) 					
	or die('Nie mogę połączyć się z bazą danych<br />Błąd: '.mysql_error()); 




$query="select * from kursy";
$result=mysql_query($query);

$num=mysql_numrows($result);

mysql_close($connection); 



$i=0;


echo "
TABELA kursy
<table border = 2>
<tr>
<td width = 20px align = center>ID</td>
<td width = 100px align = center>Przedmioty</td>
<td width = 100px align = center>Data</td>
</tr>
</table>
";


while ($i < $num) {

$id=mysql_result($result,$i,"id");
$przedmioty=mysql_result($result,$i,"przedmioty");
$data=mysql_result($result,$i,"data");


echo "
<table border = 2>
<tr>
<td width = 20px align = center>$id</td>
<td width = 100px align = center>$przedmioty</td>
<td width = 100px align = center>$data</td>
</tr>
</table>
";


$i++;

}

//  KONIEC TABELA KURSY
?>




<br><br><hr>




<?php 

// WYPISANIE DANYCH Z TABELI zapisy

 $connection = @mysql_connect('127.0.0.1', root, greg)         
		or die('Brak połączenia z serwerem MySQL.<br />Błąd: '.mysql_error());
	$db = @mysql_select_db('zapisy', $connection) 
		or die('Nie mogę połączyć się z bazą danych<br />Błąd: '.mysql_error()); 



$query=" select 
	studenci.nazwisko, kursy.przedmioty, sala.nr_sali 
	 from
	zapisy, studenci, kursy, sala 
	 where
	studenci.id = id_studenci and kursy.id = id_kursy and sala.id = id_sala
	";

$result=mysql_query($query);

$num=mysql_numrows($result);

mysql_close($connection); 



$i=0;

while ($i < $num) {


$nazwisko=mysql_result($result,$i,"nazwisko");
$przedmioty=mysql_result($result,$i,"przedmioty");
$nr_sali=mysql_result($result,$i,"nr_sali");


echo "
$nazwisko    $przedmioty    sala: $nr_sali<br><hr>
";



$i++;
}

//   KONIEC WYPISANIE DANYCH Z TABELA zapisy
?>



</div>
</body>
</html>

 

przed chwila probowalem wszystko wrzucic w <?php, a kod html wziac w echo"";

ale tez nie wyswietlalo poprawnie(tzn nie czytalo danych z bazy)

Edited by greg505

Share this post


Link to post
Share on other sites

czyli jezeli zaczne w kodzie html

<?php

polaczenie z baza

.

.

.?>

 

html

.

.

 

<?php

. //tu tez wykonuje operacje na bazie

.

.

mysql_close($connection);

?>

powinno dzialac?

Mistrzu - ja wiem ze dopiero zaczynasz :) ale takie pisanie aplikacji to jak zaciskanie sobie petli na szyje - wpisz w google MyActiveRecord sciagnij ta klase z PHPClasses - dokumentacja do niej jest SWIETNA - i rozwiaze 99% twoich problemow z MySQL.

 

Pamietaj tez ze zaczynajac mozesz zaczac wpajac sobie dobre wzorce od począkku - pisanie kodu php i html napewno do nich nie należy... system szablonow to około 2 tygodnie nauki możesz tyle nie mieć - ale zrozumienie MyAR i przepisanie kodu prezentacji w zwykle pliki PHP zajmie ci 1 dzien i twoja aplikacja osiagnie zupelnie nową jakość bedzie prostsza i nie bedziesz sie w niej gubic (co pewno juz powoli sie dzieje.)

 

pozdro ;)

 

OK. Prosty edit - poswiece 15 min i napisze szybki tutorial ze wzorca MVC dla totalnych newbie

 

wiec tak :

 

MVC to sposob pisania aplikacji ktory pozwala pisac aplikacje w sposob przejrzysty tak zebys sam sie nei zamotał w tym co robisz...

MVC sklada sie z 3 filarów :

 

M jak Model - jesli przeczytasz dokumentacje klasyMyActiev Record to dowiesz sie ze klasy ktore tworzysz aby zmapowac tabele w bazie (a sa one BANALNIE proste) to wlasnie klasy modelu - bedziesz potrzebowac jedna taka klase na tabele w bazie - Model to ta czesc aplikacji ktora POBIERA DANE.

 

C jak Controller - tu dzieje sie magia - to tu wywolujesz Metody modelu - ktore zwracają ci dane - tymi danymi manipulujesz włączając do nich to co dostaniesz od usera (jesli np ktos poda id strony nr 11 to pobierasz od usera 11 w $_GET pobierasz dane z bazy o takim id (za pomoca metod w modelu) i wyświetlasz odpowiedni WIDOK.

 

przykladowy kloik kontrolera ktory zawiera 2 akcje wyswietlanie newsow i wyswietlanie konkretnej strony o konkretnym id :

<?phpswitch($_GET['dzial']) {case 'news':$newsy = // tu pobierasz jakos newsy za pomoca MyActiveRecord - nie powiem jak bo to twoje zadanmie domowe - ale jest to JEDNA LINIJKA koduinclude('widok/newsy.php'); // tu includujesz sobie widok - co to jest widok czytasz dalej wazne ze robisz to po tym jak pobrales danebreak;case 'strona':if(!ermpty($_GET['id'])) {$strona = // jak wyzej tu pobierasz sobiekonkretna strone o id jakie podal uzytkownik w $_GET - to tez pisze w dokumentacji klasy MyAR}include(widok/strona.php);break;}

to co jest waze to to ze kontroler nie zajmuje sie tym jak strony wygladaja - on zajmuje sioe tylko tym co dostaje od usera (czyli danymi w POST i GET i na podstawie tego wykonuje jakis kawalek kodu (tu sekcja case) i wywoluje odpowiedni widok.

 

 

Widok :

 

to poprostu plik php lktory dostaje np zmienna newsy zawierajaca 5 newsow i musli ja wyswietlic w takiej formie jak chcesz - divy tabelki co tam potrzebujesz ! widok nie modyfikuje danych - to jest wazne - tu tylko wyswietlasz ! nic wiecej !

 

co ci da taki design aplikacji ? to ze mawsz wszystko ladnie poukladane - teraz jesli chcesz zmienic to jak wygladaja np newsy robisz to w pliku widoku - i masz pewnosc ze reszta aplikacji sie nie rozpierdzieli - jesli na jednej stronie chcesz wyswietlic 200 nie 2 newsy - starczy zmienic parametry w kontrolerze - MyAR ppobierze sama co trzeba.

 

Wiem ze przyklad ktory tu podalem jest szczatkowy i byc moze malo przejrzysty - jak cos to zachecam d dalszych pytań ! :)

Edited by Yacho

Share this post


Link to post
Share on other sites

skoro tak mowisz to sie jutro nia zainteresuje ;)

 

 

edit:

 

juz ostatnie pytanie ;]

 

mam zapytanie

$query=" select				studenci.nazwisko, studenci.imie, kursy.przedmioty, kursy.sala, kursy.nazwisko				from zapisy, studenci, kursy				where studenci.id = id_studenci and kursy.id = id_kursy 			  ";

czyli zapytanie do 3 tabel

 

w tabeli studenci i przedmioty sa takie same pola (imie, nazwisko)

 

 

uzywam

while ($wiersz1=mysql_fetch_array($result))	   {	   		echo "<table border='1'>			 <tr> 			   			   <td width = 100px align = center>".$wiersz1['przedmioty']."</td>			   <td width = 100px align = center>".$wiersz1['nazwisko']."</td>			   <td width = 100px align = center>".$wiersz1['imie']."</td>			   <td width = 100px align = center>".$wiersz1['nazwisko']."</td>			   <td width = 100px align = center >".$wiersz1['sala']."</td>			  			 </tr>			 </table>	   ";}

jak to wyswietlic zeby byly dwa pola nazwisko(i dwa imie)?

 

oczywiscie po zmianie nazwy bedzie dzialac ale nie o to chodzi ;)

Edited by greg505

Share this post


Link to post
Share on other sites

zdob var_dump($wiersz1);

 

dostaniesz strukture tego co sie z bazy pobiera i bedziesz mogl dalej z tym kombinowac.... po co trzymasz imie i nazwisko w 2 miejscach ? to jest zla konstrukcja....

 

Znowu mowie - zainteresuj sie MyActiveRecord

Share this post


Link to post
Share on other sites

jak dwa pola nazwisko i 2 imie? Gdzie to chcesz wyświetlać? Wyświetlasz nazwe kolumny czy dane w tej kolumnie?

 

I zamiast pisać taki łamany kod htmlowo/phpowy, który absolutnie nie nadaje się do poprawek... zobacz co to jest smarty :)

Share this post


Link to post
Share on other sites

no tak mi się też wydawało.. no ale w czym problem?

 

jedyne co mi na myśl przychodzi to to , że chcesz aby tutaj dobrać się do odpowiedniej nazwy kolumny...

$wiersz1['nazwisko']
aby nie zmieniać nazwy kolumny w bazuni, w zapytaniu sql mozna użyć przemapowania nazwy zmiennej

select studenci.nazwisko [b]as[/b] nazwisko_stud, kursy.nazwisko [b]as[/b] nazwisko_kursy ...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...


Aktualności

Artykuły



×
×
  • Create New...