Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Błąd "Duplicate entry
Forum PHP.pl > Forum > Przedszkole
tabassccoo
Witam.

Sprawa wygląda następująco: utworzyłem sobie bazę danych w jednym pliku no i baza została utworzona pomyślnie. W tym samym pliku do tej bazy utworzyłem 3 tabele. W nowym pliku natomiast chciałem te tabele uzupełnić za pomocą polecenia:
Kod
INSERT

Składnia sprawdzona i poprawna więc sprawdzam czy tabele zostały uzupełnione i wtedy na ekranie przeglądarki ukazuje się komunikat:
Cytat
Duplicate entry 1 for key 1


W takiej sytuacji chciałem zachować się jak powinien każdy szanujący się użytkownik internetu i skorzystałem z wyszukiwarki internetowej. Znalazłem rozwiązanie i zamieniłem polecenie
Kod
INSERT

na:
Kod
REPLACE

Ku mojemu zdziwieniu na ekranie pojawił się komunikat, że tabele zostały poprawnie uzupełnione. Uradowany zabrałem się za odpytywanie mojej bazy aż tu nagle moim oczom ukazuje się:
Cytat
Query was empty

Rączki mi opadły i szukam jakiejś podpowiedzi, pomocy czy czegoś takiego. Ogólnie z tym pierwszym problemem z którym jakos sobie poradziłem moim zdaniem sytuacja jest o tyle dziwniejsza, że tabele miały być uzupełniane poraz pierwszy, więc dziwię się skąd zduplikował się klucz. Jeśli na to pytanie też mi ktos udzieli odpowiedzi będę dozgonnie wdzięczny.

Zaznaczyć chcę tylko, że pracuje lokalnie oczywiście, ale wszystko jest dobrze skonfigurowane. No to co mogę w tej sytuacji zrobić?

Pozdrawiam
sowiq


Sorry, popsuła mi się kula. W takim razie będziesz musiał dać jakiś kod, wygląd tabelki, zapytanie, albo cokolwiek... To, że INSERT służy do dodania rekordu wie chyba 99,9% userów tego forum winksmiley.jpg
tabassccoo
To jedziemy z tymi kodami wedle życzenia, na początek kod pliku w ktorym uzupelniam tebale:
Kod
<?php

$connect = mysql_connect("localhost","uzytkownik","haslo")
     or die ("Sprawdz polaczenie z serwerem.!");
    
mysql_select_db("moviesite");

//  pierwotnibylo INSERT ale wyskakiwal blad o ktorym pisalem wyzej
$insert = "REPLACE INTO movie (movie_id, movie_name, movie_type,".
"movie_year, movie_leadactor, movie_director)".
"VALUES (1,'Bruce Wszechmogacy',5,2003,1,2),".
"(2,'Zycie biurowe',5,1999,5,6),".
"(3,'Wielki Kanion',2,1991,4,3)";
$results = mysql_query($insert)
     or die(mysql_error());


$type = "REPLACE INTO movietype (movietype_id,movietype_label)".
"VALUES (1,'Science-fiction'),".
"(2,'Dramat'),".
"(3,'Przygoda'),".
"(3,'Wojenny'),".
"(4,'Komedia'),".
"(5,'Horror'),".
"(6,'Akcja'),".
"(7,'Dla dzieci')";
$results = mysql_query($type)
      or die(mysql_error());        
    

$people = "REPLACE INTO people (people_id,people_fullname,".
"people_isactor,people_isdirector)".
"VALUES (1,'Jim Carrey',1,0),".
"(2,'Tom Shadyac',0,1),".
"(3,'Lawrence Kasdan',0,1),".
"(4,'Kevin Kline',1,0),".
"(5,'Ron Livingston',1,0),".
"(6,'Mike Judge',0,1)";
$results = mysql_query($people)
     or die(mysql_error());
    
echo "Dane zostaly wstawione poprawnie!";
?>

Teraz kolej na kod w ktorym tworze sama baze i tabele
Kod
<?php
// polaczenie z serwerem MySQL; uzylismy wlasnych parametrow
// w razie potrzeby zmien je na inne
$connect = mysql_connect("localhost","uzytkownik","haslo") or
     die ("Sprawdz polaczenie z serwerem.");
    
// utworz baze danych jesli jeszcze nie istnieje
$create = mysql_query("CREATE DATABASE IF NOT EXISTS moviesite")
     or die (mysql_error());
    
// wybierz nowo utworzona baze danych
mysql_select_db("moviesite");

// utworz tabele "movie"
$movie = "CREATE TABLE movie(
     movie_id int(11) NOT NULL auto_increment,
     movie_name varchar(255) NOT NULL,
     movie_type tinyint(2) NOT NULL default 0,
     movie_year int(4) NOT NULL default 0,
     movie_leadactor int(11) NOT NULL default 0,
     movie_director int(11) NOT NULL default 0,
     PRIMARY KEY (movie_id),
     KEY movie_type (movie_type,movie_year)
     )";
$results = mysql_query($movie)
     or die (mysql_error());
    
// utworz tabele "movietype"
$movietype = "CREATE TABLE movietype(
     movietype_id int(11) NOT NULL auto_increment,
     movietype_label varchar(100) NOT NULL,
     PRIMARY KEY (movietype_id)
     )";
$results = mysql_query ($movietype)
     or die (mysql_error());
    
// utworz tabele people
$people = "CREATE TABLE people(
     people_id int(11) NOT NULL auto_increment,
     people_fullname varchar(255) NOT NULL,
     people_isactor tinyint(1) NOT NULL default 0,
     people_isdirector tinyint(1) NOT NULL default 0,
     PRIMARY KEY (people_id)
     )";
$results = mysql_query ($people)
     or die (mysql_error());
    
echo "Poprawnie utworzono baze danych filmow.";
?>

a teraz kod z zapytaniem do bazy:
Kod
<?php
// polaczenie z serwerem MySQL
$connect = mysql_connect("localhost","uzytkownik","haslo")
     or die ("Sprawdz polaczenie z serwerem.!");
    
// uaktywnij odpowiednia baze danych
mysql_select_db("moviesite");

$query = "SELECT movie_name,movie_type".
"FROM movie".
"WHERE movie_year>1990".
"ORDER BY movie_type";
$results = mysql_query($qurey)
     or die(mysql_error());
    
while ($row = mysql_fetch_array($results)) {
     extract($row);
     echo $movie_name;
     echo " - ";
     echo $movie_type;
     echo "
";
}
?>


Całą resztę problemu opisałem wyżej
sowiq
Pora późna, a kodu sporo smile.gif

Ja bym zrobił:
1. zamiast REPLACE -> INSERT
2. nie wpisywałbym wartości pól auto_increment - po to są auto_increment, żeby same się wpisywały. Zresztą masz na nie pozakładane PRIMARY KEY'e i stąd Twoje komunikaty o błędach.

Czyli zamiast:
  1. REPLACE INTO movie (movie_id, movie_name, movie_type
  2. [...]
  3. "VALUES (1,'Bruce Wszechmogacy',5,2003,1,2),".

zrób:
  1. INSERT INTO movie (movie_name, movie_type
  2. [...]
  3. "VALUES ('Bruce Wszechmogacy',5,2003,1,2),".
itd. Tak samo z pozostałymi pozostałymi zapytaniami.

Aha - polecam zaopatrzeć się w phpMyAdmin smile.gif Pomaga w tego typu problemach.
tabassccoo
No dobra po części pomogło z tym, że na zapytanie baza nadal odpowiada o pustej zmiennej chociaż powinno wyswietlić 3 wyniki.
I jak sobie z tym poradzić? Mam phpMyAdmina cos tam patrzałem naprawiałem testowałem kopie robocze oczywiście zrobione, ale nie moge go jakos "ogarnąć", ale wróćmy to głównego tematu co teraz z tym zapytaniem gdzie tam jest cos pomieszane?
JankesZiom
Mam ten sam problem i faktycznie zlikwidowanie manualnego wpisywania wszystkich PRIMARY KEY pomaga, ale skoro w książce do nauki PHP (PHP5, Apache i MySQL od podstaw) jest podany kod w takiej postaci jak przedstawił go kolega to jednak coś musi być na rzeczy. Wątpię, żeby autorzy pisali sobie ot tak po prostu, chociaż każdy ma prawo się pomylić.
Ktoś ma jakiś pomysł?
darko
offtopic.gif
Cytat(JankesZiom @ 8.02.2010, 23:57:11 ) *
Mam ten sam problem i faktycznie zlikwidowanie manualnego wpisywania wszystkich PRIMARY KEY pomaga, ale skoro w książce do nauki PHP (PHP5, Apache i MySQL od podstaw) jest podany kod w takiej postaci jak przedstawił go kolega to jednak coś musi być na rzeczy. Wątpię, żeby autorzy pisali sobie ot tak po prostu, chociaż każdy ma prawo się pomylić.
Ktoś ma jakiś pomysł?

Oj zdziwiłbyś się, ile jest błędów, nieporozumień i wpadek w różnych książkach. Autorzy zapewne założyli, że dodawanie rekordów następuje od samego początku, tj. od wartości auto increment == 1 i że w tabeli nie ma jeszcze żadnych rekordów. Najbezpieczniej więc jest wykorzystać - przy operacji insert - właściwość pól autoinkrementowanych i po prostu olać je nie podając żadnej wartości, niech baza sama sobie ustawi poprawną. A jak w książce napiszą, że 2 jest równe 4329489237, to też łykniesz ? Trzeba myśleć. Pozdrawiam

EOT
JankesZiom
Racja trzeba myśleć i dlatego, dopiero zaczynając swoją przygodę z PHP i ucząc się z owej książki jako pierwszej, nie byłem w stanie sam stwierdzić czy jest to błąd autorów. Założyłem raczej, że jednak ja, jako początkujący zrobiłem coś źle. Ale skoro już wiem, to dobrze:) dzięki
-thepanone-
Cytat(sowiq @ 5.12.2008, 01:27:28 ) *
Pora późna, a kodu sporo smile.gif

Ja bym zrobił:
1. zamiast REPLACE -> INSERT
2. nie wpisywałbym wartości pól auto_increment - po to są auto_increment, żeby same się wpisywały. Zresztą masz na nie pozakładane PRIMARY KEY'e i stąd Twoje komunikaty o błędach.

Czyli zamiast:
<!--Geshi:121371:sql--><pre class="sql" style="font-family:monospace;"><div class="head">[SQL] ype</div><li class="li2"><div class="de2"><span class="br0">[</span><span class="sy0">...</span><span class="br0">]</span></div><li class="li1"><div class="de1"><span class="st0">"VALUES (1,'Bruce Wszechmogacy',5,2003,1,2),"</span><span class="sy0">.</span></div>
[/list]<div class="foot">[SQL] <a href='./Pobierz-Plik-121371.html
, ype</div><li class="li2"><div class="de2"><span class="br0">[</span><span class="sy0">...</span><span class="br0">]</span></div><li class="li1"><div class="de1"><span class="st0">"VALUES ('Bruce Wszechmogacy',5,2003,1,2),"</span><span class="sy0">.</span></div>
[/list]<div class="foot">[SQL] <a href='./Pobierz-Plik-121372.html
, plaintext </div></pre><!--/Geshi:121372:sql--> itd. Tak samo z pozostałymi pozostałymi zapytaniami.

Aha - polecam zaopatrzeć się w phpMyAdmin smile.gif Pomaga w tego typu problemach.


(powrót do przeszłości 7)

skierował mnie do tego topicu ten sam problem, z tym samym podręcznikiem.

jestem początkujący, w jaki sposób w tym konkretnym problemie pomógłby phpMyAdmin?
-thepanone-
Mi, dodatkowo, zapytanie

  1. <?php
  2. // polaczenie z serwerem MySQL
  3. $connect = mysql_connect("localhost","root","******")
  4. or die ("Sprawdz polaczenie z serwerem.!");
  5.  
  6. // uaktywnij odpowiednia baze danych
  7. mysql_select_db("moviesite");
  8.  
  9. $query = "SELECT movie_name, movie_type " .
  10. "FROM movie".
  11. "WHERE movie_year>1990 ".
  12. "ORDER BY movie_type";
  13.  
  14. $results = mysql_query($query)
  15.  
  16. while ($row = mysql_fetch_array($results)) {
  17. extract($row);
  18. echo $movie_name;
  19. echo " - ";
  20. echo $movie_type;
  21. echo "<br>";
  22. }
  23. ?>


dla tej samej bazy co w temacie (odpowiednio poprawionej wg wskazówek sowiq) wywala błąd następujący:

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 '>1990 ORDER BY movie_type' at line 1
mmmmmmm
Pewnie spacja po "movie" by pomogła...
thepanone
pomogła ta spacja
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.