php-mysql νεα εγγραφη

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
nikoskourtis
Δημοσιεύσεις: 26
Εγγραφή: 07 Μάιος 2008 00:17

php-mysql νεα εγγραφη

Δημοσίευση από nikoskourtis » 21 Ιαν 2009 20:16

Σε ενα e-shop θελω οταν ο administrator προσθετει ενα προϊον να μπορει ταυτοχρονα να προσθετει και μια φωτογραφια του προϊοντος.

Το προβλημα ειναι το εξης:
Οταν προστεθει το προϊον αυτο παιρνει αυτοματα απο τη mysql ενα id που ειναι μοναδικο προφανως (auto_increment). Αυτο το id ομως δεν το ξερει εκ των πρωτερων το php script. Θελω λοιπον η εικονα του προϊοντος να αποθηκευεται στο server με το ονομα του id (που ειναι μοναδικο) του προϊοντος. Πως μπορω λοιπον να ξερω τι id δoθηκε στο νεο προϊον; Πως θα ξερει η php τι id εδωσε η mysql στο νεο μου προϊον;

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

php-mysql νεα εγγραφη

Δημοσίευση από fafos » 21 Ιαν 2009 22:52

nikoskourtis έγραψε:Σε ενα e-shop θελω οταν ο administrator προσθετει ενα προϊον να μπορει ταυτοχρονα να προσθετει και μια φωτογραφια του προϊοντος.

Το προβλημα ειναι το εξης:
Οταν προστεθει το προϊον αυτο παιρνει αυτοματα απο τη mysql ενα id που ειναι μοναδικο προφανως (auto_increment). Αυτο το id ομως δεν το ξερει εκ των πρωτερων το php script. Θελω λοιπον η εικονα του προϊοντος να αποθηκευεται στο server με το ονομα του id (που ειναι μοναδικο) του προϊοντος. Πως μπορω λοιπον να ξερω τι id δoθηκε στο νεο προϊον; Πως θα ξερει η php τι id εδωσε η mysql στο νεο μου προϊον;
enas tropos einai me ena query (prin kanei egrafh tou neou proiontos) na pairneis to id ths teleytaias eggrafhs sthn vash sou...

enas allos einai na exeis thn function tou anevasmatos ths eikonas meta to insert ths eggrafhs tou proiontos opote me mia query travas to id apo thn vash..
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php-mysql νεα εγγραφη

Δημοσίευση από korgr » 22 Ιαν 2009 13:40

Πρωτα κανεις την εισαγωγη στην βαση σου
μετα το id σου ειναι το:

Κώδικας: Επιλογή όλων

$id=mysql_insert_id();
Τωρα μπορεις να αποθηκευσεις και το image γνωριζοντας πλεον το id...

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

php-mysql νεα εγγραφη

Δημοσίευση από Apostolis_38 » 22 Ιαν 2009 14:36

Αν και θεωρητικά ο τρόπος του korgr μαλλον είναι ο "σωστότερος" να σημειώσω εδώ ένα προβληματάκι που μου είχε τύχει.
σε φόρμα upload και καταχώρησης σχετιζόμενων εγγραφών στη βάση, που είχα φτιάξει, ενώ ανέβαζε την εικόνα στο upload directory, παρ' όλα αυτά δεν μου περνούσε τίς εγγραφές στη βάση. Ετσι το mysql_insert_id δεν έπαιζε και ο συσχετισμός id με εικόνα "τιναζόταν" στον αέρα στο επόμενο upload. Ετσι κατέφυγα στη λύση που συνιστά ο fafos με το max(id) και καταχωρούσα με το "ζόρι" το τελευταίο id.
Υποθέτω πως το πρόβλημα είχε να κάνει με δικαιώματα (δεν βρήκα άλλη λογική εξήγηση) αλλά απέφυγα να αλλάξω το script γιατί με αυτά τα μηχανήματα του διαβόλου :D ποτέ δεν ξέρεις...

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

php-mysql νεα εγγραφη

Δημοσίευση από Cha0s » 22 Ιαν 2009 14:51

Η mysql_insert_id() θεωρώ είναι η πιο σωστή και γρήγορη (όχι σε επίπεδο κώδικα αλλά δεν επίπεδο εκτέλεσης) λύση.

Αν δεν έκανε insert στην βάση το script σου τότε το πρόβλημα είναι στο query σου και σε ελειπείς ελέγχους στο τι θα κάνει το script όσο προχωράει.

Ο τρόπος που αναφέρεις (στην συγκεκριμένη περίπτωση) δεν θα έλεγα ότι είναι πιο safe καθώς αν δεν γίνει το insert και εσύ κάνεις select το τελευταίο ID, τότε θα σου φέρει το id της προηγούμενης εγγραφής και όχι της τελευταίας.
Άρα η αντιστοίχηση εγγραφής - εικόνας θα γίνει λάθος (με ότι συνέπειες έχει αυτό στην περίπτωση σου).

Άρα προτιμότερο είναι να ελέγχεις αν έγινε όντως το insert και μετά να προχωράς στο επόμενο βήμα του script σου.

Πχ:

Κώδικας: Επιλογή όλων

mysql_query ("INSERT INTO table (field) VALUES ('data')", $db);
$mysql_error = mysql_error();
if (!$mysql_error){
//κάνε ότι έχεις να κάνεις σε περίπτωση που το insert έγινε σωστά
$insert_id = mysql_insert_id();
}else{
//τύπωσε μήνυμα λάθους ή κάνε κάτι άλλο σε περίπτωση που το insert δεν έγινε.
echo $mysql_error;
}

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php-mysql νεα εγγραφη

Δημοσίευση από korgr » 22 Ιαν 2009 15:15

Εχει απολυτο δικιο ο Cha0s! Παραλειψη μου να τονισω πως παγιδευουμε τα λαθη στο insert.
Ενα παραδειγμα μαζι με το upload του image:

Κώδικας: Επιλογή όλων

mysql_query($query) or die("MYSQL ERROR: ".mysql_error()); //insert query
$lastid=mysql_insert_id();
$imagename=$lastid.".jpg";
$imname=($_FILES['photo']['name']=="none")? "" : $_FILES['photo']['name'];
if($imname){
move_uploaded_file ($_FILES['photo']['tmp_name'],"../images/products/".$imagename);
}

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

php-mysql νεα εγγραφη

Δημοσίευση από Apostolis_38 » 22 Ιαν 2009 15:20

Κι όμως το πρόβλημα δεν ήταν στο query ή σε άλλο έλεγχο. Απειροτσεκαρισμένα τα πάντα.

Σχετικά με τον δεύτερο τρόπο, δεν σε κατάλαβα. Αφού σε ένα auto_increment πεδίο η προηγούμενη εγγραφή (δηλαδή η τελευταία που καταχωρήθηκε) είναι πάντα και η τελευταία. Αν δεν γίνει το insert αμέσως οποιαδήποτε στιγμή κι αν βάλεις το id πάντα αναφέρεσαι στο τελευταίο upload και με ένα

Κώδικας: Επιλογή όλων

update table... set ... = ... where id = ... 
είσαι εντάξει. Αφού βέβαια πρίν έχεις τραβήξει το max(id).

Εντάξει αυτό που λές για τους ελέγχους εξυπακούεται αλλά απο τη στιγμή που έστω και ένα field περνιέται στη βάση, το script θεωρεί οτι εκτελέστηκε σωστά.
Ισως η ιδέα σου να είναι καλή και να πρέπει να τσεκάρω και δεύτερο ή και τρίτο field αλλά δεν ξέρω αν συμφέρει απο άποψη "επιβάρυνσης" του χρόνου εκτέλεσης.


Επίσης, να σημειώσω πως έχω φτιάξει το script να τρέχει ΑΦΟΥ γίνει το upload, γιατί οι λόγοι που μπορεί να μην τρέξει το upload είναι πιό πολλοί (μέγεθος, file type κ.λ.π.) οπότε να μην περνιούνται εγγραφές χωρίς να έχει ανέβει εικόνα.

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

php-mysql νεα εγγραφη

Δημοσίευση από fafos » 22 Ιαν 2009 15:26

Basika oloi oi tropoi einai lathos gia to sygkekrimeno provlhma... h kalyterh methodos (kateme) einai na na anebainei h photo se epomeno vhma gia na apofygoume tis kakotopies pou poly pithanon na prokypsoun.. kati to opoio kanoun oles oi megales efarmoges..
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php-mysql νεα εγγραφη

Δημοσίευση από korgr » 22 Ιαν 2009 15:32

Κατσε Αποστολη μου να τα ξεκαθαρισουμε λιγο...
Κατ' αρχην εμενα ποτε δεν μου δημιουργησε προβλημα η συγκεκριμενη μεθοδος! Αν το query εκτελεστει εστω και με ενα field η συναρτηση θα εχει το τελευταιο id.

Ας παρουμε τωρα την περιπτωση σου τωρα να δεις που μερικες φορες το φαινομενικα σωστο ειναι τελικα το λαθος...
Κάνεις μια insert
Παιρνει id πχ = 35
Μετα για καποιο λογο την διαγραφεις (δεν κανουμε μονο insert στις βασεις ε?)
Τελευταια εγγραφη πλεον ειναι η id=34 σωστα?

Παμε τωρα να κανουμε ενα νεο insert με την δικη σου μεθοδο!
Δεν θα μας δωσει 35 ως επομενο λογικο id η max? Θα μας δωσει!
Κανε το insert σου και δες το id
Ειναι το 36 Αποστολη μου και οχι το 35 που εσυ λογικα θα περιμενες :(

Και τρως ετσι ολο σου το βραδυ ψαχνοντας που εγινε το λαθος :evil:

nikoskourtis
Δημοσιεύσεις: 26
Εγγραφή: 07 Μάιος 2008 00:17

php-mysql νεα εγγραφη

Δημοσίευση από nikoskourtis » 22 Ιαν 2009 16:22

Ευχαριστω πολυ για τις απαντησεις.
Βασικα αυτο που χρειαζομουν ηταν η εντολη "mysql_insert_id()"

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

php-mysql νεα εγγραφη

Δημοσίευση από Apostolis_38 » 22 Ιαν 2009 17:57

Ωπ! εσύ ποιός είσαι πάλι; :D :D :D :D
Ωραία, αφού σε βοηθήσαμε όλα καλά.

@korgr: με τον τρόπο που το λές εσύ ναι, έτσι θα συμβεί και αυτή είναι η φυσική ροή των πραγμάτων..
Ακου (ή διάβασε :D ) όμως τι κουφό μου είχε συμβεί.

Για να σου μιλήσω με πραγματικά δεδομένα:

1. Ανεβαίνει το file
2. Εκτελείτε το query:

Κώδικας: Επιλογή όλων

$query1 = "insert into banners values
                  (' ".$bid." ' , ' ".$barea." ', ' ".$banner." ', ' ".$bweb." ' )" ;
3. καταχωρείτε στη βάση ΜΟΝΟ το bid και τα υπόλοιπα πεδία είναι blank. Αυτομάτως το bid έχει πάρει νέο νούμερο.
4. Γίνετε αναζήτηση του bid:

Κώδικας: Επιλογή όλων

$query3 = "select max(bid) as maxbid from banners" ;
   $result3 = mysql_query($query3) or die(mysql_error()); 
   $row = mysql_fetch_assoc($result3);
   $replace_bid = $row['maxbid'];
5. Δίνοντε εκ νέου τα στοιχεία:

Κώδικας: Επιλογή όλων

$query4 = "update banners set banner = '".$banner."' where bid = '".$replace_bid."' " ;
Το πρόβλημα στο βήμα 3 ήταν που μου δημιουργούσε το πρόβλημα και με τσάκιζε.
Αν θυμάμαι καλά το έχω ξαναναφέρει αλλά εν πάσει περιπτώση.
Το script αυτό του upload το είχα γράψει και λειτουργούσε ΑΨΟΓΑ όταν χρησιμοποιούσα $userfile==.... και $uploaddir = absolute path";
Οταν το άλλαξα για να το "εκσυγχρονίσω" με τα $userfile = $_FILES... και
$uploaddir = $_SERVER['DOCUMENT_ROOT']."/path/";
μου προέκυψαν διάφορα κουφά.
Οπως για παράδειγμα οτι με τον πρώτο τρόπο ο owner του uploaded file ήμουνα εγώ, ενώ με τον δεύτερο ο Apache.
H όπως σου ανέφερα το script πάει να προσθέσει μία εγγραφή, περνάει το bid αλλά όχι τα υπόλοιπα data. Προφανώς η MySQL αντιλαμβανόταν "κίνηση" και επειδή το πεδίο είναι auto_increment έκανε το καθήκον της.

Γι αυτό οδηγήθηκα στο συμπέρασμα οτι ο τρόπος που χειρίζονται τα αρχεία αυτές οι εντολές δημιουργούν "πρόβλημα" με τα δικαιώματα.
Δεν ξέρω αν όντως είναι έτσι αλλά δεν ξέρω τι άλλο να υποθέσω.

Με την υποσημείωση οτι κι εμένα σε οποιοδήποτε άλλο script το myswl_insert_id δουλεύει άψογα.

Ο λόγος που δεν επανέφερα το παλιό script και πάω Πάτρα μέσω Μόσχας είναι οτι είναι πιο flexible για να περνιέται πιο εύκολα απο project σε project.
Και θεωρητικά είναι πιο σωστό μιάς και ακολουθεί και την "εξέλιξη" της PHP.

Αυτά :D :D :D

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

php-mysql νεα εγγραφη

Δημοσίευση από vassilism » 22 Ιαν 2009 18:06

fafos έγραψε:Basika oloi oi tropoi einai lathos gia to sygkekrimeno provlhma... h kalyterh methodos (kateme) einai na na anebainei h photo se epomeno vhma gia na apofygoume tis kakotopies pou poly pithanon na prokypsoun.. kati to opoio kanoun oles oi megales efarmoges..
Θα συμφωνήσω και εγώ με τον fafo.
Επίσης με αυτό τον τρόπο μπορείς να ανεβάσεις περισότερες των μια εικόνων και να τις επεξεργάζεσαι καλύτερα.

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

php-mysql νεα εγγραφη

Δημοσίευση από Cha0s » 22 Ιαν 2009 18:42

Apostolis_38 έγραψε:Οπως για παράδειγμα οτι με τον πρώτο τρόπο ο owner του uploaded file ήμουνα εγώ, ενώ με τον δεύτερο ο Apache.
Σε καμία περίπτωση δεν γίνεται να αλλάξει το uid & gid των αρχείων επειδή χρησιμοποίησες global μεταβλητές της PHP.
Δεν στέκει. Οι μόνοι τρόποι να ανεβάσεις αρχείο μέσω PHP και τα έχει το uid σου είναι είτε να τρέχεις την PHP με suexec (αν θυμάμαι σωστά) ή να κάνεις upload το file με ftp functions αντί για την function move_uploaded_file().
Apostolis_38 έγραψε:Γι αυτό οδηγήθηκα στο συμπέρασμα οτι ο τρόπος που χειρίζονται τα αρχεία αυτές οι εντολές δημιουργούν "πρόβλημα" με τα δικαιώματα.
Δεν ξέρω αν όντως είναι έτσι αλλά δεν ξέρω τι άλλο να υποθέσω.
Κάτι άλλο έχει αλλάξει από πλευράς server προφανώς (αν δεν άλλαξες κάτι στο script).
Η συμπεριφορά του να έχει uid του apache είναι απόλυτα normal και ισχύει από τότε που ξεκίνησα να ασχολούμαι με PHP.


Σχετικά με το insert, select, update διαφωνώ κάθετα.
3 Queries για μία απλή καταχώρηση μαζί με 1 upload;

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php-mysql νεα εγγραφη

Δημοσίευση από korgr » 22 Ιαν 2009 20:04

Εδω θυμηθηκα τα λογια του dimsis:
Καθένας με τα σπαγγέτι του αρκεί να δουλεύουν
:lol: :lol: :lol:

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

php-mysql νεα εγγραφη

Δημοσίευση από Apostolis_38 » 23 Ιαν 2009 11:57

Κάπως έτσι είναι.
"Οπως τον βρούμε τον καιρό τον αρμενίζουμε" που λέει κι ο ποιητής :D
Κι εγώ έφτιαξα 3 query για να αντιμετωπίσω το πρόβλημα που μου παρουσιάστηκε. Σε κανονικές συνθήκες το ένα είναι αρκετό.
Πάντως δεν χρησιμοποίησα ftp functions για το upload.
Αναφορικά με το suexec, απο λίγο που το έψαξα πιθανώς να έχει δίκιο ο Cha0s (συν το ότι το πρόβλημα αυτό το αντιμετώπισα με έναν μόνο συγκεκριμένο server).
Δεν μπορώ όμως κάθε φορά να μαντεύω πως έχει στήσει ο άλλος τον server του :-?

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης