Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: UPDATE pola +1
Forum PHP.pl > Forum > Bazy danych
eremen
Witam,

Tabela ma wzór:
co ile

auto1 0
auto2 0
auto3 0
...
auto10 0

Chciałbym aby po oddaniu głosu(kod php, sonda typu 'radio') na odpowiednie auto dodawał się w Tabeli SQL głos(+1) w kolumnie 'ile'.
Dosyć dużo zrobiłem w kodzie jednak coś robię nadal nie tak;/
  1. // tworzenie tabeli
  2. mysql_query ('
  3. CREATE TABLE ankieta(
  4. co char(6),
  5. ile int NULL,
  6. PRIMARY KEY(co)
  7. )
  8. ');
  9.  
  10. mysql_query ('
  11. INSERT INTO ankieta(co, ile) VALUES
  12. (\'auto1\' , \'\'),
  13. (\'auto2\' , \'\'),
  14. (\'auto3\' , \'\'),
  15. (\'auto4\' , \'\'),
  16. (\'auto5\' , \'\'),
  17. (\'auto6\' , \'\'),
  18. (\'auto7\' , \'\'),
  19. (\'auto8\' , \'\'),
  20. (\'auto9\' , \'\'),
  21. (\'auto10\' , \'\')
  22. ');
  23. //------------------------------------------------------------------
  24. IF (isset($_POST['haslo']) && $_POST['glosuj']) {
  25.  
  26. IF (in_array($_POST['haslo'], $kody)){
  27.  
  28. //ZAPISYWANIE WYNIKOW DO PLIKOW
  29. $filename=$_POST['auto'].'.txt';
  30. $votes = 1;
  31.  
  32. IF(file_exists($filename)){
  33. $votes = file_get_contents($filename);
  34. $votes++;
  35.  
  36.  
  37.  
  38. //zapisanie do bazy
  39. mysql_query('
  40. UPDATE ankieta SET ile = ile+1 WHERE \'co\' = $_POST[\'auto\'];
  41. ');
  42. //-------------------------------------------
  43.  
  44.  
  45.  
  46.  
  47. }
  48.  
  49. file_put_contents($filename, $votes);
  50. $message = "dziękujemy za oddanie głosu";
  51.  
  52. //USUWANIE WPISANEGO HASŁA Z PLIKU I ZASTAPIENIE GO INNYM
  53.  
  54. srand((double)microtime()*1000000);
  55. $kod2=md5(uniqid(rand()));
  56. $nowehaslo = substr($kod2,0,5);
  57.  
  58. $kody; // tablica haseł pobrana z pliku z hasłami
  59.  
  60. $kody[array_search($_POST['haslo'], $kody)] = $nowehaslo;
  61.  
  62. file_put_contents("kody.txt", serialize($kody));
  63. }
  64. else {
  65. $message = "wpisałeś niepoprawne hasło";
  66. }
  67. }
  68. //------------------------------------------------------------------
mortus
co w tym zapytaniu:
  1. UPDATE ankieta SET ile = ile+1 WHERE \'co\' = $_POST[\'auto\'];

to nazwa kolumny w tabeli w bazie danych, a nazwy kolumn obejmujemy gravisami (`, znaczek z tyldą na klawiaturze), a nie apostrofami '. Rozumiem, że tworzenie tabeli i dodawanie nowych rekordów odbywa się tylko raz. Pozostaje jeszcze kwestia wyglądu formularza, czy jesteś pewien, że w $_POST['auto'] znajduje się odpowiednia wartość?

Debuguj zapytania SQL:
  1. mysql_query('zapytanie') or die(mysql_error());
eremen
Cytat(mortus @ 25.03.2012, 13:12:11 ) *
co w tym zapytaniu:
  1. UPDATE ankieta SET ile = ile+1 WHERE \'co\' = $_POST[\'auto\'];

to nazwa kolumny w tabeli

nazwa kolumny to 'ile' i 'co'

Cytat
w bazie danych, a nazwy kolumn obejmujemy gravisami (`, znaczek z tyldą na klawiaturze), a nie apostrofami '.

Czyli
  1. UPDATE ankieta SET (`ile`) = (`ile`) + 1 WHERE (`co`) = $_POST[`auto`]
?

Cytat
Rozumiem, że tworzenie tabeli i dodawanie nowych rekordów odbywa się tylko raz.

Nad tym muszę jeszcze popracować. Na razie wykluczam ten fragment poprzez komentarz.

Cytat
Pozostaje jeszcze kwestia wyglądu formularza, czy jesteś pewien, że w $_POST['auto'] znajduje się odpowiednia wartość?

Wydaje mi się, że tak. skoro wcześniej przy zapisywaniu do pliku korzysta z tego samego elementu(dodając .txt) to czy nie zadziała to dla bazy?

Cytat
Debuguj zapytania SQL:
  1. mysql_query('zapytanie') or die(mysql_error());

poprawię

mortus
Ciągle nieprawidłowo budujesz zapytanie, tylko nazwy kolumn w tabeli w bazie danych obejmujemy gravisami, natomiast wartości obejmujemy apostrofami. Dodatkowo zmienna $_POST['auto'] jest nadal zmienną PHP i powyższa reguła nie ma do niej zastosowania. Powinno być:
  1. mysql_query("UPDATE ankieta SET (`ile`) = (`ile`) + 1 WHERE (`co`) = '{$_POST['auto']}");
  2. // lub
  3. mysql_query('UPDATE ankieta SET (`ile`) = (`ile`) + 1 WHERE (`co`) = \''.$_POST['auto'].'\'');

No i jeśli wszystko inne działa dobrze, to i to zapytanie powinno zadziałać.
eremen
Dziękuję za pomoc. Na razie nie działa mi serwer, więc nie mogę sprawdzić czy działa. Dam znać przy najbliższej okazji wink.gif

hej, udało mi się w końcu dostać do serwera.

Otrzymałem taki komunikat o błędzie:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(`ile`) = (`ile`) + 1 WHERE (`co`) = 'auto10' at line 1

widzę już że czyta poprawnie $_POST['auto'] ponieważ jest w treści 'auto10' na które akurat chciałem głosować.
To nie zmienia faktu że jest gdzieś błąd ;/

podam kod:
  1. <?php
  2. //SPRAWDZANIE CZY PLIK ISTNIEJE
  3. $plik = "kody.txt";
  4.  
  5. if (!file_exists($plik)) {
  6.  
  7. for ($s = 0; $s < 11; $s++){
  8. srand((double)microtime()*1000000);
  9. $kod=md5(uniqid(rand()));
  10.  
  11. $txt = substr($kod,0,5); //okrajamy kod do 5 znakĂłw
  12.  
  13. $kody[] = $txt; // tutaj zapisujemy okrojony kod do tablicy
  14. }
  15.  
  16. file_put_contents("kody.txt", serialize($kody));
  17. }
  18. else{
  19. $kody = unserialize(file_get_contents('kody.txt'));
  20. }
  21. //---------------------------------------------------------------------
  22.  
  23.  
  24. //BAZA SQL
  25. // Ĺ_Ä_czymy siÄ_ z serwerem
  26. mysql_connect('localhost', 'p1sffs2', 'dsdl') or die(mysql_error());
  27.  
  28. // Wybieramy bazÄ_, ktĂłrej bÄ_dziemy uĹźywaÄ_
  29.  
  30.  
  31. /*// tworzenie tabeli
  32. mysql_query ('
  33. CREATE TABLE ankieta(
  34. co char(6),
  35. ile int NULL,
  36. PRIMARY KEY(co)
  37. )
  38. ') OR DIE(mysql_error());
  39.  
  40. mysql_query ('
  41. INSERT INTO ankieta(co, ile) VALUES
  42. (\'auto1\' , \'\'),
  43. (\'auto2\' , \'\'),
  44. (\'auto3\' , \'\'),
  45. (\'auto4\' , \'\'),
  46. (\'auto5\' , \'\'),
  47. (\'auto6\' , \'\'),
  48. (\'auto7\' , \'\'),
  49. (\'auto8\' , \'\'),
  50. (\'auto9\' , \'\'),
  51. (\'auto10\' , \'\')
  52. ') OR DIE(mysql_error());
  53. //------------------------------------------------------------------*/
  54.  
  55. if (isset($_POST['haslo']) && $_POST['glosuj']) {
  56.  
  57. if (in_array($_POST['haslo'], $kody)){
  58.  
  59. //ZAPISYWANIE WYNIKOW DO PLIKOW
  60. $filename=$_POST['auto'].'.txt';
  61. $votes = 1;
  62.  
  63. if(file_exists($filename)){
  64. $votes = file_get_contents($filename);
  65. $votes++;
  66.  
  67. //zapisanie do bazy
  68. mysql_query("UPDATE ankieta SET (`ile`) = (`ile`) + 1 WHERE (`co`) = '{$_POST['auto']}") OR DIE(mysql_error());
  69. //-------------------------------------------
  70. }
  71.  
  72. file_put_contents($filename, $votes);
  73. $message = "dziÄ_kujemy za oddanie gĹ_osu";
  74.  
  75. //USUWANIE WPISANEGO HASĹ_A Z PLIKU I ZASTAPIENIE GO INNYM
  76.  
  77. srand((double)microtime()*1000000);
  78. $kod2=md5(uniqid(rand()));
  79. $nowehaslo = substr($kod2,0,5);
  80.  
  81. $kody; // tablica haseĹ_ pobrana z pliku z hasĹ_ami
  82.  
  83. $kody[array_search($_POST['haslo'], $kody)] = $nowehaslo;
  84.  
  85. file_put_contents("kody.txt", serialize($kody));
  86. }
  87. else {
  88. $message = "wpisaĹ_eĹ_ niepoprawne hasĹ_o";
  89. }
  90. }
  91. //------------------------------------------------------------------
  92.  
  93. //POKAZUJE SONDE
  94. echo '<p><map glosuj="glosuj">
  95. <form action="" method="post">
  96. <table align="center" style="text-align:center;">
  97. <tr>
  98. <td>1.<label for="guzik1" style="cursor:pointer"><img src="./zdjecia/auto1.jpg" alt="" /></label></td>
  99. <td>3.<label for="guzik3" style="cursor:pointer"><img src="./zdjecia/auto3.jpg" alt="" /></label></td>
  100. <td>5.<label for="guzik5" style="cursor:pointer"><img src="./zdjecia/auto5.jpg" alt="" /></td>
  101. <td>7.<label for="guzik7" style="cursor:pointer"><img src="./zdjecia/auto7.jpg" alt="" /></td>
  102. <td>9.<label for="guzik9" style="cursor:pointer"><img src="./zdjecia/auto9.jpg" alt="" /></td>
  103. </tr>
  104. <tr>
  105. <td>2.<label for="guzik2" style="cursor:pointer"><img src="./zdjecia/auto2.jpg" alt="" /></label></td>
  106. <td>4.<label for="guzik4" style="cursor:pointer"><img src="./zdjecia/auto4.jpg" alt="" /></label></td>
  107. <td>6.<label for="guzik6" style="cursor:pointer"><img src="./zdjecia/auto6.jpg" alt="" /></label></td>
  108. <td>8.<label for="guzik8" style="cursor:pointer"><img src="./zdjecia/auto8.jpg" alt="" /></label></td>
  109. <td>10.<label for="guzik10" style="cursor:pointer"><img src="./zdjecia/auto10.jpg" alt="" /></label></td>
  110. </tr>
  111. </table>
  112.  
  113. <div style="margin:20px 0 0 0">
  114. <input type="radio" name="auto" value="auto1" id="guzik1" checked="checked"/> nr 1.
  115. <input type="radio" name="auto" value="auto2" id="guzik2"/> nr 2.
  116. <input type="radio" name="auto" value="auto3" id="guzik3"/> nr 3.
  117. <input type="radio" name="auto" value="auto4" id="guzik4"/> nr 4.
  118. <input type="radio" name="auto" value="auto5" id="guzik5"/> nr 5.
  119. <input type="radio" name="auto" value="auto6" id="guzik6"/> nr 6.
  120. <input type="radio" name="auto" value="auto7" id="guzik7"/> nr 7.
  121. <input type="radio" name="auto" value="auto8" id="guzik8"/> nr 8.
  122. <input type="radio" name="auto" value="auto9" id="guzik9"/> nr 9.
  123. <input type="radio" name="auto" value="auto10" id="guzik10"/> nr 10.
  124. </div>
  125.  
  126. <div><br/> <input type="text" name="haslo"/><input type="submit" name="glosuj" value="gĹ_osuj" /><br/><br/>';echo $message;'</form></map></p>';
  127. //---------------------------------------------------------------------------------------------------------
  128. ?>

Proszę o pomoc. Pozdrawiam smile.gif
mortus
Mój błąd, skopiowałem Twoje zapytania z nawiasami i to one powodują błąd. Powinno być:
  1. mysql_query("UPDATE ankieta SET `ile` = `ile` + 1 WHERE `co` = '{$_POST['auto']}'") OR DIE(mysql_error());


@down: Jeszcze apostrofa brakowało. Poprawiłem.
eremen
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''auto10' at line 1

teraz coś takiego tongue.gif a może jednak źle czyta tę $_POST['auto']...
viking
  1. mysql_query("UPDATE ankieta SET ile = ile + 1 WHERE co = ". mysql_real_escape_string($_POST['auto'])) OR DIE(mysql_error());


mysql_error to nie jest żadne debugowanie.
eremen
dałem tak jak radził viking i wyszedł błąd: Unknown column 'auto10' in 'where clause'
mortus
Bo kolega viking poprawił źle. Do tego gdzie jest błąd doszedłbyś sam, gdybyś zastosował nieco inny zapis:
  1. $sql = "UPDATE `ankieta` SET `ile` = `ile` + 1 WHERE `co` = '". mysql_real_escape_string($_POST['auto']) ."'";
  2. echo $sql; // dla testów

@viking: z komunikatów błędów mysql_error() można bardzo wiele wyczytać, jeśli tylko ktoś potrafi je właściwie zinterpretować i zawsze jest to jakiś sposób na "debugowanie" błędów (tym razem napisałem słówko debugowanie w cudzysłowie, żebyś nie zrozumiał zbyt dosłownie).

EDIT: Powyżej też poprawiłem.
eremen
trochę mi mieszacie, teraz mam błąd : syntax error, unexpected '=' in /home/p13/domains/p13.nsf.pl/public_html/sonda/ankieta.php on line 69
ale nadal nie wiem jak to naprawić. Z błędu wyczytuję że jest niepoprawnie (wstawiony?) znak '=' ale co z tym zrobić.. to ni wiem...

EDIT: ten błąd wyskakuje po użyciu powyższego kodu mortusa...
viking
Zjadłem apostrofy wokół mysql_real_escape_string. Ale powinieneś z tego wyciągnąć kilka wniosków.
1) Czytać dokumentację bo masz tam bardzo czytelny przykład ze sprintf
2) wartość stringowa wstawiana do bazy bez quotów jest traktowana jak kolumna
3) zabezpieczaj zawsze skrypty
4) poczytać o PDO

@mortus
Dawno nie pisałem nic w "gołym" mysql i nawet nie mam jak sprawdzić ale po co `` wokół wszystkiego co się da?
mortus
Cytat(viking @ 27.03.2012, 14:59:39 ) *
@mortus
Dawno nie pisałem nic w "gołym" mysql i nawet nie mam jak sprawdzić ale po co `` wokół wszystkiego co się da?

To z przyzwyczajenia smile.gif Tak mi się jakoś utrwaliło ostatnimi czasy obejmowanie nazw kolumn gravisami. Być może to przez użytkowników tego forum, którzy czasami nazywają kolumny w swoich tabelach np. time, date, a to powoduje błędy w zapytaniach, jeśli się takiej nazwy kolumny gravisami nie obejmie.

@eremen: Dobry edytor z kolorowaniem składni powinien wszystko pokazać. Dodatkowo polecam poczytać lekturę obowiązkową.
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.