Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Odczyt i zapis w tej samej tabeli na tej samej stronie
Forum PHP.pl > Forum > Przedszkole
v1t4n
Witam

Chcialem zrobic mozliwosc edytowania menu. Problem pojawia sie gdy chce dodac nowy link do bazy, mianowicie na stronie ktora laczy sie z baza i dodaje wpis pojawia sie blad z wyswietlaniem menu. Problem wystepuje tylko na tej stronie - gdy przejdzie sie na inna wszystko jest w porzadku. Blad jest taki ze podaje mi pierwsze litery z nazwy i url do strony, wiec zamiast
  1. <a href="index.php">Strona glowna</a>

pokazuje sie '
  1. <a href="i">S</a>

Rowniez wpis do bazy ktory jest jednoczesnie tworzony jest bledny. Przekreca pierwsza litere z kazdego pola. Zamiast
Kod
Ksiega gosci

tworzy
Kod
asiega gosci

i zamiast
Kod
index.php?action=guestbook

wstawia
Kod
andex.php?action=guestbook


Nie wiem, moze wina wynika z bledu apache. Testowalem narazie tylko u siebie (korzystam z WebServa).

Kod wyswietlania menu: (w pliku cfg.txt zapisane sa zmienne dotyczace hosta, loginu, hasla i nazwy bazy mysql)
  1. <?php
  2. include('cfg.txt');
  3. $sql = mysql_connect($mysqlhost, $mysqllogin, $mysqlpassword);
  4. mysql_select_db($mysqldbname);
  5. echo(naglowek('Menu'));
  6. print '<div class="menu">';
  7. $sql2 = 'SELECT * FROM `menu` ORDER BY `id` ASC LIMIT 0, 30 ';
  8. $idsql2 = mysql_query($sql2);
  9. $menulicz=0;
  10. while($wiersz = mysql_fetch_array($idsql2))
  11. {
  12. $menuid[$menulicz]=$wiersz[0];
  13. $menuname[$menulicz]=$wiersz[1];
  14. $menuurl[$menulicz]=$wiersz[2];
  15. $menutarget[$menulicz]=$wiersz[3];
  16. if($menutarget[$menulicz]=1)
  17. {
  18. $menutarget[$menulicz]='';
  19. }
  20. if($menutarget[$menulicz]=0)
  21. {
  22. $menutarget[$menulicz]=' target="_blank"';
  23. }
  24. $href[0] = '--> <a href="';
  25. $href[1] = $menuurl[$menulicz];
  26. $href[2] = '"';
  27. $href[3] = $menutarget[$menulicz];
  28. $href[4] = '>';
  29. $href[5] = $menuname[$menulicz];
  30. $href[6] = '</a><BR>';
  31. $link = implode('', $href);
  32. print $link;
  33. }
  34. print '</div>';
  35. ?>

Dodawanie wpisu do bazy:
  1. <?php
  2. $sql3 = 'SELECT `id` FROM `menu` ORDER BY `id` DESC LIMIT 0, 1 ';
  3. $idsql3 = mysql_query($sql3);
  4. while ($wiersz = mysql_fetch_row($idsql3))
  5. {
  6. $ilosclinkow=$wiersz[0];
  7. }
  8. $ilosclinkow++;
  9. echo($ilosclinkow);
  10. $sql3 = 'INSERT INTO `menu` (`id`, `name`, `url`, `target`) VALUES (''. $ilosclinkow .'', ''. $menuname .'', ''. $menuurl .'', ''. $menutarget .'');';
  11. $sql3 = 'INSERT INTO `menu` (`id`, `name`, `url`, `target`) VALUES (''. $ilosclinkow .'', ''. $menuname .'', ''. $menuurl .'', ''. $menutarget .'');';
  12. mysql_query($sql3);
  13. print 'Link został pomyślnie dodany';
  14. ?>

Tekst skopiowalem ze srodka sformatowanego skryptu strony wiec jest duzo spacji.
Za ewentualna niewiedze ze stosowania podstawowych funkcji przepraszam i obiecuje sie poprawic smile.gif
uli
Oczywiście że tak się dzieje, bo:

href[0] to 1-szy znak zmiennej href
href[1] to 2-gi znak zmiennej href

itd

Rozwiązanie:

Zamiast href[0], href[1] itd w ten sposób:

  1. <?php
  2. $link = '--> <a href="';
  3. $link .= $menuurl[$menulicz];
  4. $link .= '"';
  5. $link .= $menutarget[$menulicz];
  6. $link .= '>';
  7. $link .= $menuname[$menulicz];
  8. $link .= '</a><BR>';
  9. ?>


Wywalić:
$link = implode('', $href);

Widzisz już gdzie masz błąd? smile.gif
v1t4n
ale tak dzieje sie tylko gdy dodaje nowy link, normalnie dziala dobrze...
Kicok
1. Przypisanie zamiast porównania:
  1. <?php
  2. if($menutarget[$menulicz]=1)
  3. ?>


2. Jeśli kolumna menu.id jest kluczem podstawowym z auto_increment, to nie musisz się bawić w sprawdzanie ostatniego ID i zwiększać go o jeden. W ogóle nie musisz bawić się z ID - jeśli nie wstawisz go do zapytania, to kolumna ta zostanie uzupełniona automatycznie.


Natomiast co do zamieniania pierwszej litery na "a", to nigdzie tego nie widzę. Wklej cały kod dodawania linków do bazy.
v1t4n
  1. <?php
  2. if($cat=='addlink')
  3. {
  4. if (!isset($_SESSION['zalogowany']))
  5.  {
  6. echo(error('Musisz być zalogowany, żeby móc dodawać newsy.'));
  7. }
  8.  else
  9. {
  10.  
  11. $sql = mysql_connect($mysqlhost, $mysqllogin, $mysqlpassword);
  12. mysql_select_db($mysqldbname);
  13. $pytanie7 = 'SELECT `class` FROM `users` WHERE `username` = ''. $_SESSION['login'] .'' LIMIT 0, 30 ';
  14. $idzapytania5 = mysql_query($pytanie7);
  15. while ($wiersz = mysql_fetch_row($idzapytania5))
  16.  {
  17.  $_SESSION['classMS'] = $wiersz[0];
  18.  }
  19. if ($_SESSION['classMS']==3||$_SESSION['classMS']==4)
  20.  {
  21.  echo(error('Nie masz uprawnień żeby dodawać nowe newsy. Żeby móc dodawać newsy musisz mieć r
    angę "Klasowicz" lub "Admin". Aby zmienić rangę swojego konta poproś o to Admina.'
    ));
  22.  }
  23. if ($_SESSION['classMS']==1||$_SESSION['classMS']==2)
  24.  {
  25. echo(naglowek('Dodawanie linków'));
  26. echo(tree('3', 'Panel administracyjny --> Menu --> Dodaj link'));
  27. if($id==1||$id=='')
  28. {
  29. print 'Link zostanie automatycznie dodany jako ostatni. Jeżeli chcesz zmienić jego kole
    jność wejdź w edytowanie menu<P>'
    ;
  30. print '<table><form method="post" action="index.php?action=menusettings&cat=addlink&id=2"><tr>';
  31. print '<td width="100"><input type="text" name="menuname" size="18"></td>';
  32. print '<td width="190"><input type="text" name="menuurl" size="35"></td>';
  33. print '<td width="50"><select name="menutarget">';
  34. print '<option value="0" selected>W tym oknie</option>';
  35. print '<option value="1">W nowym oknie</option></select>';
  36. print '</td></tr></table><center><input type="submit" value="Dodaj link"></form>';
  37. }
  38. if($id==2)
  39. {
  40. $sql3 = 'SELECT `id` FROM `menu` ORDER BY `id` DESC LIMIT 0, 1 ';
  41. $idsql3 = mysql_query($sql3);
  42. while ($wiersz = mysql_fetch_row($idsql3))
  43. {
  44. $ilosclinkow=$wiersz[0];
  45. }
  46. $ilosclinkow++;
  47. echo($ilosclinkow);
  48. $sql3 = 'INSERT INTO `menu` (`id`, `name`, `url`, `target`) VALUES (''. $ilosclinkow .'', ''. $menuname .'', ''. $menuurl .'', ''. $menutarget .'');';
  49. mysql_query($sql3);
  50. print 'Link został pomyślnie dodany';
  51. }
  52.  }
  53.  }
  54. }
  55. ?>
Caly skrypt na dodawanie linkow. Podobny problem wystepuje gdy chce edytowac menu blink.gif !? Gdy ustawie zeby menu w tym momencie w ktorym zmieniane sa wpisy w bazie sie nie wyswietlaly to dziala !? nie moge tego pojac, a poza tym wkurza mnie to prymitywne rozwiazanie ;/
Kicok
Co do prymitywnego rozwiązania, to muszę się zgodzić.

A co do literki "a":
1. Dodajesz link do bazy na podstawie informacji pobranych z formularza. Tutaj wszystko jest OK. Zmienna $menuname jest teraz oczywiście stringiem.
2. Następnie wyświetlasz menu (Patrz: kod z twojego pierwszego posta). W tym celu używasz niezadeklarowanych zmiennych jako tablic. Ale niezadeklarowane to one są tylko z pozoru. Tak naprawdę, to zmienna $menuname istnieje => patrz punkt 1.
3. Jako, że $menuname to jest string, to pisząc: $menuname[0] odwołujesz się do pierwszego znaku tego stringu, a nie pierwszego elementu tablicy
4. W pętli nie zwiększasz zmiennej $menulicz, więc z każdym przejściem nadpisywany jest pierwszy znak zmiennej $menuname pierwszym znakiem zmiennej $wiersz[1]
5. Tak samo podczas składania linku - odwołujesz się do pierwszego znaku stringu, a nie do pierwszego elementu tablicy, więc zamiast nazwy linku wyświetla ci jakieś "a"

6. Nie wstawiaj do swojego kodu funkcji: error_reporting( E_ALL | E_STRICT ); bo się przestraszysz
7. Powodzenia w pisaniu skryptów używających register_globals
v1t4n
heh dzieki za pomoc smile.gif) ale jak sie robi po nocach to sie nie pamieta gdzie jaka zmienna byla smile.gif)
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.