πληροφοριακα μηυματα λαθους

Από που να ξεκινήσω; Που θα βρω; κ.α. γενικές ερωτήσεις για την δημιουργία μιας ιστοσελίδας.

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

Απάντηση
stavroula_apo
Δημοσιεύσεις: 121
Εγγραφή: 18 Σεπ 2010 03:12

πληροφοριακα μηυματα λαθους

Δημοσίευση από stavroula_apo » 26 Φεβ 2011 16:21

σχεδιαζω μια σελιδα η οποια συνδεεται με μια βαση δεδομενων. εχω μια σελιδα html η οποια περιλαμβανει μια φορμα με την οποια καταχωρω τα στοιχεια ενος φοιτητη στη βαση μ.η σελιδα αυτη συνδεεται με μια σελιδα php η οποια εμφανιζει την καταχωρηση του φοιτητη σε ενα πινακα που περιλαμβανει τα πεδια της φορμας και τις αντιστοιχες τιμες που εχω καταχωρησει.ο πινακας μ student περιλαμβανει τα πεδια studid, studfirst, studlast, studemail, studbirth, studaddress. το πεδιο studid αποτελει πρωτευον κλειδι κ ειναι μοναδικο. οταν λοιπον παω να καταχωρησω ενα καινουργιο φοιτητη με ενα studid οπως ειναι φυσικο μου εμφανιζει μηνυμα duplicate entry 2 for primary key.θελω λοιπον να το αλλαξω αυτο και να εμφανιζει ενα πιο πληροφοριακο μηνυμα λαθους.δλδ ας πουμε πχ υπαρχει ηδη καταχωρηση με κωδικο 1 αλλα δε ξερω να το κανω αυτο...μπορει να με βοηθησει καποιος σ'αυτο?να μ πει πως γινεται...?

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

πληροφοριακα μηυματα λαθους

Δημοσίευση από fafos » 26 Φεβ 2011 16:49

ti kodikos einai autos? yparxei hdh gia kathe student h ton vazei automata to systhma?
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

πληροφοριακα μηυματα λαθους

Δημοσίευση από dimsis » 26 Φεβ 2011 18:07

Καταρχήν να υποθέσουμε ότι δεν βολεύεσε με auto increment studid;

Εκεί που εκτελείς το insert query λογικά μπορείς να τσιμπήσεις το error της mysql με κάτι σαν:

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

if(mysql_error())
{
    // Κώδικας που πετάει π.χ. ένα lightbox με το μήνυμα που θέλεις
die();
}
ή εναλλακτικά (και καλύτερα κατά τη γνώμη μου) αν δεν θέλεις να φτάνεις μέχρι το σημείο που θα χτυπήσει error η mysql, τραβάς πριν το insert ένα select query με το studid που πρόκειται να καταχωρηθεί και προχωράει στο insert μόνο αν δεν υπάρχει ήδη καταχωρημένο στην db και παράλληλα εμφανίζει και το μήνυμα σου...

stavroula_apo
Δημοσιεύσεις: 121
Εγγραφή: 18 Σεπ 2010 03:12

πληροφοριακα μηυματα λαθους

Δημοσίευση από stavroula_apo » 26 Φεβ 2011 18:22

εγω τον εισαγω. αλλα θα μπορουσε να ειναι κ autonumber. αλλα ουτε πως να το βαλω ετσι ξερω... κτλβ τι θελω να κανω?

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

πληροφοριακα μηυματα λαθους

Δημοσίευση από fafos » 26 Φεβ 2011 18:39

stavroula_apo έγραψε:εγω τον εισαγω. αλλα θα μπορουσε να ειναι κ autonumber. αλλα ουτε πως να το βαλω ετσι ξερω... κτλβ τι θελω να κανω?
anoigeis to phpmyadmin pas sto pedio studid kai tsekareis to AUTO_INCREMENT
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

πληροφοριακα μηυματα λαθους

Δημοσίευση από dimsis » 26 Φεβ 2011 18:44

Πηγαίνεις από την εφαρμογή που διαχειρίζεσαι την βάση δεδομένων σου, στις ιδιότητες του πεδίου studid και λογικά θα σου έχει option AUTO_INCREMENT (έτσι το έχει π.χ. το phpmyadmin) και το τσεκάρεις, έπειτα δεν χρειάζεται να το εισάγεις εσύ το κλειδί, θα σου βάζει αυτόματα το αμέσως επόμενο.
Αν δεν σου κάνει, δοκίμασε την πρόταση για το select πριν το insert που σου 'γραψα πριν.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

πληροφοριακα μηυματα λαθους

Δημοσίευση από dva_dev » 26 Φεβ 2011 19:26

Ισως θα μπορούσες να ελέγξεις τον κωδικό του λάθους με τη mysql_errno και να δίνεις το μήνυμα που θέλεις.
http://www.php.net/manual/en/function.mysql-errno.php
http://dev.mysql.com/doc/refman/5.5/en/ ... erver.html

Π.χ.
Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)
Message: Duplicate entry '%s' for key %d

stavroula_apo
Δημοσιεύσεις: 121
Εγγραφή: 18 Σεπ 2010 03:12

πληροφοριακα μηυματα λαθους

Δημοσίευση από stavroula_apo » 26 Φεβ 2011 23:19

dva_dev έγραψε:Ισως θα μπορούσες να ελέγξεις τον κωδικό του λάθους με τη mysql_errno και να δίνεις το μήνυμα που θέλεις.
http://www.php.net/manual/en/function.mysql-errno.php
http://dev.mysql.com/doc/refman/5.5/en/ ... erver.html

Π.χ.
Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)
Message: Duplicate entry '%s' for key %d
δν κτλβν...κοιτα, αυτη τη στιγμη πχ κατχωρω τα εξης στοιχεια
studid 1
studfirst μαρια
studlast παπαδοπουλου
κοκ
αν καταχωρησω ακομα ενα φοιτητη με studid στο αρχειο php που μου εμφανιζει μου λεει:
Σφάλμα:Duplicate entry '1' for key 'PRIMARY'
εγω αυτο ας πουμε θελω να λεει οτι το studid 1 υπαρχει ηδη, να ειναι δλδ ποιο πληροφοριακο.
ευχαριστω για το το auto-increment.
αλλα αφου θα το βαλω auto-increment δε θα δινει αυτοματα καινουργιο επομενο studid?

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

πληροφοριακα μηυματα λαθους

Δημοσίευση από dva_dev » 27 Φεβ 2011 00:27

Πως κάνεις το insert και σου εμφανίζεται το λάθος; Εχεις κάποια echo; die;

stavroula_apo
Δημοσιεύσεις: 121
Εγγραφή: 18 Σεπ 2010 03:12

πληροφοριακα μηυματα λαθους

Δημοσίευση από stavroula_apo » 27 Φεβ 2011 09:27

dva_dev έγραψε:Πως κάνεις το insert και σου εμφανίζεται το λάθος; Εχεις κάποια echo; die;
if(!mysql_query($query, $con)){
die("Σφάλμα:" .mysql_error($con));
}else{
echo "Η εγγραφή καταχωρήθηκε επιτυχώς! <br/><br/>";
$query="select * from student where studid=".$_POST['studid'];
$result=mysql_query($query, $con);
$row=mysql_fetch_array($result);
?>

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

πληροφοριακα μηυματα λαθους

Δημοσίευση από dva_dev » 27 Φεβ 2011 12:05

Φτιάξε μια function που να μορφοποιείς τα μηνύματα λάθους που θέλεις πχ.

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

function myerror&#40;$con&#41; &#123;
	$errNo = mysql_errno&#40;$con&#41;;
	switch &#40;$errNo&#41; &#123;
		case 1062&#58;
			$errStr = 'Δεν μπορεί να ξαναπεραστεί δεύτερη εγγραφή με τον ίδιο κωδικό.';
			break;
		case 1146&#58;
			$errStr = 'Αυτός ο πίνακας δεν υπάρχει, ψάξε αλλού.';
			break;
		default&#58;
			$errStr = mysql_error&#40;$con&#41;;
	&#125;
	return "Σφάλμα $errNo&#58; $errStr";
&#125;
Οι κωδικοί λαθών και οι περιγραφές είναι στα προηγούμενα links.

και χρησιμοποίησε τη στο die ή όπου αλλού σε βολεύει.

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

...
if &#40;!mysql_query&#40;$query, $con&#41;&#41; &#123;
	die&#40;myerror&#40;$con&#41;&#41;;
&#125;else&#123;
	echo 'Η εγγραφή καταχωρήθηκε επιτυχώς! <br/><br/>';
...

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

πληροφοριακα μηυματα λαθους

Δημοσίευση από pimpogio » 27 Φεβ 2011 13:17

το error handling με procedural programming ειναι σκετη κολαση και ειναι πολυ πιθανον να οδηγησει σε προβληματικο κωδικα ...

Αυτο που θες λεγετε exceptions βαζεις PDO για db access και σου πεταει ενα PDOΕxception το οποιο
το κανεις catch οπου θες και τυπωνεις το μυνημα σου.
Ετσι και πολυ απλο ειναι και δεν κανεις κοτετσι τον κωδικα σου.
Τα exceptions γι αυτο βγηκανε για να κανουνε ευκολο
το error handling.
H php εχει αντιγραψει το μοντελο exceptions της java και παραλληλα το εχει απλοποιησει στο μεγιστο βαθμο
που δεν θα σου παρει πανω απο 15 λεπτα για να μαθεις
τα exceptions στην php.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

πληροφοριακα μηυματα λαθους

Δημοσίευση από dva_dev » 27 Φεβ 2011 16:06

Φίλε pimpogio θα μπορούσες να δώσεις ένα snippet πως θα μπορούσαν να χρησιμοποιηθούν τα exceptions στον παραπάνω κώδικα (ή σε αντίστοιχο χρησιμοποιώντας pdo) για να δωθούν κατανοητά μηνύματα λάθους στον χρήστη αντί του "Duplicate entry '%s' for key %d".

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

πληροφοριακα μηυματα λαθους

Δημοσίευση από pimpogio » 27 Φεβ 2011 17:30

dva_dev έγραψε:Φίλε pimpogio θα μπορούσες να δώσεις ένα snippet πως θα μπορούσαν να χρησιμοποιηθούν τα exceptions στον παραπάνω κώδικα (ή σε αντίστοιχο χρησιμοποιώντας pdo) για να δωθούν κατανοητά μηνύματα λάθους στον χρήστη αντί του "Duplicate entry '%s' for key %d".
ενα απλο singleton για το db connect

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

<?php
class DB &#123;
    private static $instance = null;
    private function __construct&#40;&#41; &#123;
    &#125;
    public static function getInstance&#40;&#41; &#123;
        if &#40;!self&#58;&#58;$instance&#41; &#123;
        	self&#58;&#58;$instance = new PDO&#40;"mysql&#58;host=".HOSTNAME.";dbname=". DATABASE, USERNAME,PASSWORD, array&#40;PDO&#58;&#58;ATTR_PERSISTENT => true&#41;&#41;;
            self&#58;&#58;$instance->setAttribute&#40;PDO&#58;&#58;ATTR_ERRMODE, PDO&#58;&#58;ERRMODE_EXCEPTION&#41;;
            self&#58;&#58;$instance->exec&#40;"SET NAMES 'utf8'"&#41;;
        &#125;
        return self&#58;&#58;$instance;
    &#125;
    private function __clone&#40;&#41; &#123;
    &#125;
&#125;
?>

και μετα οπου θελει να κανει insert κανει ας πουμε με prepared statement
(για να μη σε φανε λαχανο οι sqlinjectorades το βαζω το prepared statment)

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

$stmt = DB&#58;&#58;getInstance&#40;&#41;->prepare&#40;"INSERT INTO table &#40;column&#41; VALUES &#40;?&#41;"&#41;;
$stmt->bindValue&#40;1, $myValue&#41;;
$stmt->execute&#40;&#41;;

αν αυτο δεν κανει κανει insert λογω duplicate θα πεταξει PDOException με ολες τις πληροφοριες λαθους μεσα στο exception το οποιο exception το πιανεις η επιτοπου η το αφηνεις να προωθηθεί ποιο ψηλα και το πιανεις εκει...

το πιανεις με

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

try&#123;
.....
/*prosoxi sti seira pou tsakonete ta exceptions oi subclasses tis class Exception&#40;PDOException&#41; pane poio pano sti seira me ta catch statments logo tis ierarxias ton classes */
&#125;catch &#40;PDOException $e&#41;&#123;
	echo "A problem exists&#58; ", 
			$e->getMessage&#40;&#41;,
			$e->getCode&#40;&#41;,
			$e->getFile&#40;&#41;,
			$e->getLine&#40;&#41;;
//logging
&#125;catch &#40;Exception $e&#41;&#123;
//tsakose ola ta exceptions
//logging
&#125;

//η με κεντρικο exception handler για ολη την εφαρμογη

function exception_handler&#40;$e&#41; &#123;
	echo "A problem exists&#58; ", 
			$e->getMessage&#40;&#41;,
			$e->getCode&#40;&#41;,
			$e->getFile&#40;&#41;,
			$e->getLine&#40;&#41;;
//logging
&#125;
set_exception_handler&#40;'exception_handler'&#41;;
Αν θες specific handling οριζεις και δικα σου exceptions

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

class UserException extends Exception &#123;&#125;....
class DublicateUserException extends UserException &#123;&#125;....
παραδειγμα στο entry point της εφαρμογης μπορεις να πιανεις
ολα τα errors που δεν μπορουνε να λυθουνε τοπικα κανεις logging(πχ mail to admin@mystie.gr) και σκοτωνεις την εφαρμογη επιτοπου στελνοντας τον σε μια στατικη σελιδα...

To συγκεκριμενο exception (duplicate entry) πρεπει να το πιασεις τοπικα γιατι δεν ειναι σοβαρο και μπορει να συνεχισει απροσκοπτα η εκτελεση της εφαρμογης


Γενικα με τα exceptions απλοποιειτε πολυ σημαντικά το error handing

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

πληροφοριακα μηυματα λαθους

Δημοσίευση από dva_dev » 27 Φεβ 2011 19:27

Αυτό που κάνει ο παραπάνω κώδικας με ένα

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

if &#40;!mysql_query&#40;...&#41;&#41; &#123;
   die&#40;mysql_error&#40;&#41;&#41;;
&#125; else ...
το κάνεις με

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

try&#123;
   $stmt->execute&#40;&#41;;
&#125;catch &#40;PDOException $e&#41;&#123; 
   echo $e->getMessage&#40;&#41;; 
&#125;
Βλέπω λίγες διαφορές στον κώδικα για pdo (έχω αφαιρέσει τα κομμάτια που είναι άνευ ουσίας για να μπορεί να γίνει κάποια αντιστοίχηση), αλλά δεν βλέπω να γίνεται πουθενά αυτό που ζητείται.

Το pdo προφανώς σε κάποιο duplicate key θα απαντήσει με το ίδιο μήνυμα που βγάζει και η mysql_error(), το οποίο δεν λέει απολύτως τίποτα στον τελικό χρήστη.
Αντί να βλέπει κάτι που δεν καταλαβαίνει, πρέπει να του δωθεί κάποιο μήνυμα που θα μπορεί να καταλάβει (π.χ. "Δεν μπορεί να ξαναπεραστεί δεύτερη εγγραφή με τον ίδιο κωδικό." ή Δεν υπάρχει εγγραφή με αυτόν τον κωδικό", ή "Δεν μπορεί να γίνει εισαγωγή χωρίς υπάρχει αντίστοιχος κωδικός είδους στον πίνακα ειδών").

Αυτό το πράγμα με χρήση exceptions πως απλοποιείται;

Απάντηση

Επιστροφή στο “Γενικές ερωτήσεις κατασκευής ιστοσελίδων”

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

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