Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak sobie poradzic z tymi nawiasami? :(
Forum PHP.pl > Forum > PHP
Marusz
Kod
mysql_query("INSERT INTO adresy (imie, nazwisko, numer_gg)

             VALUES

           ('$_POST["imie"]', '$_POST["nazwisko"]', '$_POST["gg"]') ");


przeciez to nie moze byc takie chore, na jakie wyglada :/ jak to napisac poprawnie?
DeyV
Można tak:
Kod
VALUES   ('{$_POST["imie"]}' ,

lub tak:
Kod
VALUES   ('$_POST[imie]',

lub tak:
Kod


$imie = $_POST['imie']; //warto dodawć tu sprawdzania danych, choćby addslashes

## .... ##

VALUES   ('$imie', ...
[fisher]
Cytat
przeciez to nie moze byc takie chore, na jakie wyglada :/ jak to napisac poprawnie?


Co to znaczy, ze wyglada na chore ?
Marusz
Cytat
Co to znaczy, ze wyglada na chore ?

To znaczy, ze ilosc nawiasow, cudzyslowow i apostrofow mnie zabila (poczatkujacy). Ale dzieki pomocy DeyV dalem rade smile.gif
dragossani
Dla przejrzystości można np. tak:
[php:1:3d72a4d8f0]<?php
$query = sprintf("INSERT INTO adresy (imie, nazwisko, numer_gg) VALUES ('%s', '%s', '%s')",
$_POST['imie'],
$_POST['nazwisko'],
$_POST['gg']);
mysql_query($query) or die('Odpowiedni komunikat.');
?>[/php:1:3d72a4d8f0]
Marusz
Bardzo mi pomogliscie. Ale pojawil sie kolejny niuans. Googlowalem troche za nim i jedyne na co sie natknalem to tekst:
[php:1:3e67579db9]
<?
header("Pragma: no-cache");
?>
[/php:1:3e67579db9]
I ze niby to powinno pomoc. A chodzi o to, ze majac strone zbudowana tak:
[php:1:3e67579db9]
<?
header("Pragma: no-cache");
?>

<?

mysql_connect("127.0.0.1", "root", "super_tajne");
mysql_select_db("baza");

$wynik = mysql_query("SELECT * FROM adresy");

while($row = mysql_fetch_row($wynik)) {
echo "lp: " . $row[3] . "<br>";
echo "imie: " . $row[0] . "<br>";
echo "nazwisko: " . $row[1] . "<br>";
echo "<b>numer gg: </b>" . $row[2] . "<br>";
echo "<br>";
}

$f_imie = $_POST["imie"];
$f_nazwisko = $_POST["nazwisko"];
$f_gg = $_POST["gg"];

if(($f_imie=="")&&($f_nazwisko==""))

echo "nic na razie nie dopisuje";

else

mysql_query("INSERT INTO adresy (imie, nazwisko, numer_gg)
VALUES
('$f_imie', '$f_nazwisko', '$f_gg') ");

?>

<hr>

dodaj nowego

<?

global $PHP_SELF;

echo "<form method="POST" action=$PHP_SELF>";
echo " <p>imie: <input type="text" name="imie" size="20"></p>";
echo " <p>nazwisko: <input type="text" name="nazwisko" size="20"></p>";
echo " <p>numer gg: <input type="text" name="gg" size="20"></p>";
echo " <p><input type="submit" value="wyslij" name="B1"><input type="reset" value="kasuj" name="B2"></p>";
echo "</form>";
echo "<br><br>";
echo "obecnie w pamieci:" . "<br>";
echo $_POST["imie"] . "<br>";
echo $_POST["nazwisko"] . "<br>";
echo $_POST["gg"] . "<br>";

?>
[/php:1:3e67579db9]
dodaje wpis do bazy i jak odswiezam strone, wpis dodaje sie ponownie. Dodalem troche niepotrzebnych na dole instrukcji, aby sobie sprawdzic, czy to co podepne pod zmienna podczas wysylania formularza, rezyduje dalej gdzies tam (nazwalem to w "pamieci" winksmiley.jpg. Nie przejmujcie sie tez jakoscia tego kodu, ja naprawde dopiero co sie ucze oblozony ksiazkami, etc. No i jak wspominalem na poczatku listu, szukalem po sieci jak sie powinno niby takie cos zalatwic. Facet napisal tylko: hint header. No to w manualu jedyne co mi pasowalo pod to, wygladalo tak, jak widzicie w kodzie. Gdzie popelniam blad? I ostatnia sprawa to funkcja auto_increment w bazie w polu ID - dzieki niej za kazdym nowym wpisem tworzy sie nowa liczba narastajaca. Problem jest taki, ze stworze sobie 10 wpisow, skasuje 8 i dodam kolejny jeden, to nie bede mial wpisow 1, 2, 3 tylko 1, 2, 11 - jak to zmienic? Ok, to tyle. Pozdrawiam!


Prosze o umieszczanie kodu nie w znacznikach [code], a w [php]
[fisher]
Cytat
dodaje wpis do bazy i jak odswiezam strone, wpis dodaje sie ponownie.

ja bym zastosowal jakis wlasny mechanizm blokujacy mozliwosc zdublowania wpisu, np sesja + cookie, albo jakis dodatkowy wpis w bazie
A co do Pragma: no-cache to nie sadze ze mogloby pomoc, ale glowy nie dam i moge sie mylic
Cytat
I ostatnia sprawa to funkcja auto_increment w bazie w polu ID - dzieki niej za kazdym nowym wpisem tworzy sie nowa liczba narastajaca. Problem jest taki, ze stworze sobie 10 wpisow, skasuje 8 i dodam kolejny jeden, to nie bede mial wpisow 1, 2, 3 tylko 1, 2, 11 - jak to zmienic?

W manualu pisz cos takiego

Cytat
AUTO_INCREMENT sequences begin with 1. See section 8.1.3.130 mysql_insert_id(). If you delete the row containing the maximum value for an AUTO_INCREMENT column, the value will be reused with an ISAM, or BDB table but not with a MyISAM or InnoDB table. If you delete all rows in the table with DELETE FROM table_name (without a WHERE) in AUTOCOMMIT mode, the sequence starts over for all table types.


Co znaczy mniej wiecej ze jesli skasujesz rekord przedostatni a pozniej dodasz nowy to wartosc jego id bedzie miala wartosc ostatni+1

Chyba ze skasujesz wszystkie rekordy to licznik zacznie isc znowu od 1
Marusz
Cytat
Co znaczy mniej wiecej ze jesli skasujesz rekord przedostatni a pozniej dodasz nowy to wartosc jego id bedzie miala wartosc ostatni+1

No to z tego co mowisz wynika, ze tylko gdy zamieszam w srodkowych rekordach, to inkrementacja i tak doda 1 do najwiekszej liczby w spisie. A u mnie problem jest tez taki: mam wpisy
[1] Kasia
[2] Tomek
[3] Leopold
[4] Witek
i nagle sie okazalo, ze [4] Witek i [3] Leopold tu nie pasuje, wiec go wycinam. Mamy wiec:
[1] Kasia
[2] Tomek
Teraz chce dodac Michala i mam
[1] Kasia
[2] Tomek
[5 Michal
Zawsze wiecej o jeden - mimo, ze ostatnie wpisy polecialy i juz ich nie ma. Czy to tak ma byc? :? Dzieki i pozdrawiam!
DeyV
Dokładnie tak mam być w tabeli typu MyISAM. I jest to jak najbardziej pozytywne. Dlaczego? Ponieważ masz pewność, że nie wykorzystasz tego samego id wielokrotnie. A jest to przydatne, gdy tworzysz zwiazki pomiędzy różnymi tabelami. Gdy usuniesz jeden rekord, powinieneś usunąc również wszystkie rekordy z tabel z nim bezpośrednio powązanych. Jeśli tego nie zrobisz, lub pojawią sie jakies błedy, bardzo łatwo o przekłamania.

Jeśli jednak bardzo zależyci na tym, by uniknać nadmiaru "pustych" wierszy, dodajesz nowy rekord, podając jako id MAX(id)+1
[fisher]
A tak BTW to dlaczego tak zaleci ci na tych indeksach ?
Marusz
Wiesz, generalnie jeszcze nie wiem czy mi zalezy czy nie. Szukam jakiegos sposobu na oznaczenie kazdego z pol unikalnym numerem. Pozniej zas przeczytalem o auto inkrementacji i stwierdzielem, ze to bylby dobry pomysl. Chcialbym umiescic przy kazdym adresie 2 klawisze: modyfikuj i skasuj - stad moje pomysly. Zdaje sobie sprawe, ze dla Was przerabianie takich problemow to juz nuda i jakby nie patrzec rutyna,
dlatego tez dziekuje za zainteresowanie tematem i nieoceniona pomoc.
[fisher]
Cytat
Wiesz, generalnie jeszcze nie wiem czy mi zalezy czy nie. Szukam jakiegos sposobu na oznaczenie kazdego z pol unikalnym numerem. Pozniej zas przeczytalem o auto inkrementacji i stwierdzielem, ze to bylby dobry pomysl.


auto_increment daje wlasnie to czego szukasz - unikalnosc

Co by bylo gdybys skasowal rekord powiedzmy 8, pozniej dodal cos na to miejsce. Ktos na przyklad mogly odwolywac sie przez skrypt.php?id=8 to co by dostal (to co by chcial czy to co by bylo po usunieciu i dodaniu nowego rekordu)?
Podobnie byloby z obsluga relacji.
Takie cos prowadziloby do anomali w bazie i byloby niebezpieczne.

Zycze powodzenia
uboottd
Prosta, ale dosc skuteczna metoda zabezpieczenia sie przed kilkakrotnym dodaniem przez odswiezanie strony jest cos takiego (kolejne punkty to kolejne uruchomienia skryptu):
1. skrypt wypisuje formularz do wpisania danych, uzytkownik go wysyla.
2. skrypt odbiera dane, wsadza je do bazy po czym robi header ("Location: $PHP_SELF"); lub podobnie i konczy dzialanie
3. skrypt wypisuje komunikat w stylu "dziekujemy za podanie danych", kolejny formularza etc.

drugie wywolanie skryptu bedzie niewidoczne dla uzytkownika, nie odlozy mu sie tez w historii przegladarki i uzytkownik nie bedzie w stanie z zaden sposob zrobic jego odswiezenia, wiec dane do bazy wpiszesz tylko raz.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.