Προς το περιεχόμενο

Προβλημα-Απορια Με SQL (διαφωτειστε με)


RADOM

Προτεινόμενες αναρτήσεις

Καλησπερα, εχω εργασια PHP site και πρεπει να βαλω ενα database πινακα μεσα για login. Κατεβασα το WAMP απο κει πηγα στο myphpadmin και εφτιαξα τον πινακα. Το θεμα ειναι οτι ο καθηγητης ζητα να κανουμε ενα πεδιο στο οποιο να υπαρχει η επιλογη TUTOR/STUDENT. Πως θα το κανω αυτο? 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στον πινακα με τα στοιχεια του εκαστοτε χρηστη θα υπαρχει ενα πεδιο που θα ειναι τυπου πχ enum('0', '1') οπου αν ειναι 0 θα δηλωνει οτι ειναι TUTOR και αν ειναι 1 θα δηλωνει οτι ειναι STUDENT. Βεβαια μπορεις να το κανεις με διαφορους τυπους.

 

Κατα το login θα ελεγχεις αυτο το πεδιο τι τιμη εχει και αναλογως θα πραττεις.

 

 

Εγω εχω μια αλλη απορια χωρις να λεω οτι ντε και καλα μπορει να ειναι δικο σου σφαλμα. Οταν ο καθηγητης σας εδωσε την ασκηση, δεν σας εκανε προηγουμενως αναφορες περι πινακων, ειδη πεδιων στον πινακα, καποια παραδειγματα δομων και γενικως οτιδηποτε εχει να κανει με γενικες γνωσεις πανω στις βασεις δεδομενων?

Το εχω παρατηρησει γενικως και δεν αφορα μονο εσενα, οτι γινονται καποιες ερωτησεις που δειχνουν σαν να μην εχει εξηγηθει κατι το οποιο ειναι βασικο.

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στον πινακα με τα στοιχεια του εκαστοτε χρηστη θα υπαρχει ενα πεδιο που θα ειναι τυπου πχ enum('0', '1') οπου αν ειναι 0 θα δηλωνει οτι ειναι TUTOR και αν ειναι 1 θα δηλωνει οτι ειναι STUDENT. Βεβαια μπορεις να το κανεις με διαφορους τυπους.

 

Και καλύτερα να μην το κάνεις με enum καθώς πρόκειται για ένα non-standard τύπο δεδομένων της MySql που δεν υπάρχει ούτε στο πρότυπο ούτε σε άλλες υλοποιήσεις σχεσιακών βάσεων δεδομένων. Υπάρχουν άλλες επιλογές, όπως ένα CHAR(10) ή ένα TINYINT(1).

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σωστα για αυτο ανεφερα και αλλους τυπους, καλυτερα ομως με TINYINT αφου θα καταναλωσει μικροτερο χωρο στην βαση

 

Σαφώς, είναι ξεκάθαρο το σκεπτικό από το post σου.

 

Μια μικρή διαφωνία σχετικά με την αιτιολόγηση (όχι την προτροπή) για τη χρήση TINYINT: εκτός κι αν είναι μαθηματικά αποδεδειγμένο πως ο μικρότερος χώρος παίζει κάποιο ρεαλιστικό ρόλο (που στα πλαίσια μιας άσκησης σίγουρα δεν παίζει), το σωστό σκεπτικό είναι να επιλέξουμε την πιο καθαρή λύση από άποψη σχεδιασμού. Η οποία μπορεί να είναι TINYINT(1) γιατί έτσι υλοποιείται το boolean στη MySql, ή μπορεί να είναι (VAR)CHAR γιατί θέλουμε να αφήσουμε περιθώριο για περισσότερες καταστάσεις στο μέλλον.

 

Κοντός ψαλμός αλληλούια βέβαια TINYINT. Και καλά όλα αυτά αλλά μπορεί να λογαριάζουμε χωρίς τον καθηγητή/ξενοδόχο.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στον πινακα με τα στοιχεια του εκαστοτε χρηστη θα υπαρχει ενα πεδιο που θα ειναι τυπου πχ enum('0', '1') οπου αν ειναι 0 θα δηλωνει οτι ειναι TUTOR και αν ειναι 1 θα δηλωνει οτι ειναι STUDENT. Βεβαια μπορεις να το κανεις με διαφορους τυπους.

 

Κατα το login θα ελεγχεις αυτο το πεδιο τι τιμη εχει και αναλογως θα πραττεις.

 

 

Εγω εχω μια αλλη απορια χωρις να λεω οτι ντε και καλα μπορει να ειναι δικο σου σφαλμα. Οταν ο καθηγητης σας εδωσε την ασκηση, δεν σας εκανε προηγουμενως αναφορες περι πινακων, ειδη πεδιων στον πινακα, καποια παραδειγματα δομων και γενικως οτιδηποτε εχει να κανει με γενικες γνωσεις πανω στις βασεις δεδομενων?

 

Το εχω παρατηρησει γενικως και δεν αφορα μονο εσενα, οτι γινονται καποιες ερωτησεις που δειχνουν σαν να μην εχει εξηγηθει κατι το οποιο ειναι βασικο.

 

 

Η αληθεια ειναι οτι ο καθηγητης ειπε το εξης "Θεωρω δεδομενο οτι ξερετε sql απο προηγουμενο μαθημα". Δεν ξερω τι να πω. ΓΙατι δεν καναμε τοσα εκτενώς την sql σε εργαστηριο.

 

Σαφώς, είναι ξεκάθαρο το σκεπτικό από το post σου.

 

Μια μικρή διαφωνία σχετικά με την αιτιολόγηση (όχι την προτροπή) για τη χρήση TINYINT: εκτός κι αν είναι μαθηματικά αποδεδειγμένο πως ο μικρότερος χώρος παίζει κάποιο ρεαλιστικό ρόλο (που στα πλαίσια μιας άσκησης σίγουρα δεν παίζει), το σωστό σκεπτικό είναι να επιλέξουμε την πιο καθαρή λύση από άποψη σχεδιασμού. Η οποία μπορεί να είναι TINYINT(1) γιατί έτσι υλοποιείται το boolean στη MySql, ή μπορεί να είναι (VAR)CHAR γιατί θέλουμε να αφήσουμε περιθώριο για περισσότερες καταστάσεις στο μέλλον.

 

Κοντός ψαλμός αλληλούια βέβαια TINYINT. Και καλά όλα αυτά αλλά μπορεί να λογαριάζουμε χωρίς τον καθηγητή/ξενοδόχο.

 

 

Βασικα η εικονα ειναι εδω: adsadasdsa.png

 

Στο ROLE πρεπει να βαλω να εχω διπλη επιλογη. Πως το κανω αυτο? Ποιο απο ολα επιλεγω στον πινακα? Δεν βρηκα ουτε το enum ουτε το TIY που αναφερατε :(

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στο ROLE πρεπει να βαλω να εχω διπλη επιλογη. Πως το κανω αυτο? Ποιο απο ολα επιλεγω στον πινακα? Δεν βρηκα ουτε το enum ουτε το TIY που αναφερατε :(

 

Αυτό που δείχνεις στο screenshot είναι τελείως λάθος. Ο ρόλος της στήλης "function" είναι να επεξεργαστεί τα δεδομένα που πρόκειται να εισάγεις από τη στήλη value, και όχι να καθορίσει το τι είδος δεδομένων αποθηκεύεται σε κάθε στήλη -- πράγμα το οποίο αντιστοιχεί στη στήλη type η οποία δεν αλλάζει από αυτή τη σελίδα αλλά από το tab "Structure". Εκεί αναφέρονται και τα ENUM και τα TINYINT και όλα.

 

Η συμβουλή μου είναι να αφιερώσεις χρόνο για να μάθεις 5 πράγματα από SQL γιατί είναι φανερό πως αυτή τη στιγμή οι γνώσεις σου δεν είναι εκεί που πρέπει ακόμα και για αυτή την απλή άσκηση.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό που δείχνεις στο screenshot είναι τελείως λάθος. Ο ρόλος της στήλης "function" είναι να επεξεργαστεί τα δεδομένα που πρόκειται να εισάγεις από τη στήλη value, και όχι να καθορίσει το τι είδος δεδομένων αποθηκεύεται σε κάθε στήλη -- πράγμα το οποίο αντιστοιχεί στη στήλη type η οποία δεν αλλάζει από αυτή τη σελίδα αλλά από το tab "Structure". Εκεί αναφέρονται και τα ENUM και τα TINYINT και όλα.

 

Η συμβουλή μου είναι να αφιερώσεις χρόνο για να μάθεις 5 πράγματα από SQL γιατί είναι φανερό πως αυτή τη στιγμή οι γνώσεις σου δεν είναι εκεί που πρέπει ακόμα και για αυτή την απλή άσκηση.

 

Εχεις δικιο. :( Θα προσπαθησω ,ομως, να κανω τον πινακα οπως μπορω τωρα γιατι μετα εχω ενα λουκι με php που ειναι και η βασικη ασκηση. Θα δοκιμασω εκει περα να δω αν το κανα σωστα. Το θεμα ειναι , υπαρχει τροπος να δω αν εκανα σωστα τον πινακα? Κατι σαν compile πχ ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό που δείχνεις στο screenshot είναι τελείως λάθος. Ο ρόλος της στήλης "function" είναι να επεξεργαστεί τα δεδομένα που πρόκειται να εισάγεις από τη στήλη value, και όχι να καθορίσει το τι είδος δεδομένων αποθηκεύεται σε κάθε στήλη -- πράγμα το οποίο αντιστοιχεί στη στήλη type η οποία δεν αλλάζει από αυτή τη σελίδα αλλά από το tab "Structure". Εκεί αναφέρονται και τα ENUM και τα TINYINT και όλα.

 

Η συμβουλή μου είναι να αφιερώσεις χρόνο για να μάθεις 5 πράγματα από SQL γιατί είναι φανερό πως αυτή τη στιγμή οι γνώσεις σου δεν είναι εκεί που πρέπει ακόμα και για αυτή την απλή άσκηση.

 

 

Λοιπον φιλε, το εκανα. Εκανα τον πρωτο πινακα που χρειαζεται. Με ENUM κτλπ. Ολα καλα. Εχω εναν δευτερο ομως. Που ζηταει να εχει ΑΥΞΩΝ ΑΡΙΘΜΟ. Ειναι πινακας ανακοινωσεων. Αυτο πως το κανω? Εγω εβαλα ενα πεδιο AUXON ARITHMOS με type : INT και value ενα τυχαιο αριθμο πχ 1. Σωστα? Η θελει κατι αλλο? Εδω εχω κολλησει

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βάλε τις ρυθμίσεις που έχω βάλει στην παρακάτω εικόνα:

 

THANX !!! Τωρα προχωρησα και στον κωδικα της php. Εκει βρισκω ενα προβλημα. Το ποσταρα κι εδω :

http://stackoverflow.com/questions/14255270/warning-mysql-num-rows-expects-parameter-1-to-be-resource-boolean-given-in-c

 

Ριξε μια ματια και πες μου γιατι συμβαινει αυτο. Το ιδιο ακριβως ειδα σε ενα βιντεο και λειτουργουσε κανονικα :(

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

THANX !!! Τωρα προχωρησα και στον κωδικα της php. Εκει βρισκω ενα προβλημα. Το ποσταρα κι εδω :

http://stackoverflow.com/questions/14255270/warning-mysql-num-rows-expects-parameter-1-to-be-resource-boolean-given-in-c

 

Ριξε μια ματια και πες μου γιατι συμβαινει αυτο. Το ιδιο ακριβως ειδα σε ενα βιντεο και λειτουργουσε κανονικα :(

 

$query = mysql_query("SELECT * FROM table1 WHERE username=$username");

 

To username πρέπει να περικλείεται απο αυτάκια δλδ να γίνει έτσι:

$query = mysql_query("SELECT * FROM table1 WHERE username='$username'");
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δύο πράγματα:

 

1. Όπως βλέπεις η ερώτηση στο SO σηκώνει βελτίωση. Έχεις γίνει άπειρα downvoted κυρίως γιατί λες "έχω αυτό το πρόβλημα, βρείτε μου τη λύση" χωρίς να δείχνεις τι έχεις κάνει από την πλευρά σου για να το λύσεις μόνος σου, κάτι που θα έπρεπε να κάνεις (#1 στη λίστα βασικά).

 

Εφόσον το πρόβλημά σου είναι ότι "mysql_num_rows expects a resource, boolean given" αυτό που θα έπρεπε να κάνεις είναι να δεις τι παράμετρο της δίνεις ($query), από που προέρχεται αυτή η παράμετρος (από τη mysql_query) και να δείς από το manual πότε μπορεί αυτή να επιστρέψει boolean. Αν το έκανες αυτό θα έβλεπες κατευθείαν τι πήγε στραβά (το πρώτο παράδειγμα είναι ακριβώς αυτό που σου συμβαίνει) και θα είχες μάθει κάτι στην πορεία.

 

Έχε λοιπόν υπόψη ότι σε κανέναν δεν αρέσει να βοηθάει αυτούς που δε βοηθούν τον εαυτό τους, και ότι όσο πιο πολλά γνωρίζει κανείς τόσο λιγότερη διάθεση έχει να ασχοληθεί με τέτοιες περιπτώσεις γιατί δίνοντας μασημένη τροφή τη λύση βασικά σπαταλάει τον πολύτιμο χρόνο του. Και αντίστροφα, όσο πιο "βοηθητικές" είναι οι λύσεις που θα πάρεις τόσο πιο "επικίνδυνες" θα είναι γιατί αυτός που θα τις παρέχει δε θα γνωρίζει και πολλά ή δε θα αντιμετωπίζει το θέμα "όπως θα έπρεπε".

 

Case in point: η πολύ σωστή απάντηση ακριβώς απο πάνω δε σου λέει ότι αυτό που κάνεις είναι να ανοίγεις διάπλατα τις πόρτες για να "χακέψει" κανείς την εφαρμογή σου με ένα απλό SQL injection. Υπάρχουν έτοιμα προγράμματα που το κάνουν.

 

2. SQL injection. Μάθε και διόρθωσε. Και κάνε πολλά κλικ στις "related" questions στα δεξιά των σελίδων στις οποίες έκανα link.

 

Και κάτι τελευταίο, άσχετο με το συγκεκριμένο σου πρόβλημα.

 

Το StackOverflow είναι απίστευτο εργαλείο, αλλά πρέπει να το μεταχειρίζεσαι με σεβασμό. Ερωτήσεις που στο insomnia θα απαντηθούν παρόλο που είναι ελλιπώς διατυπωμένες ή δείχνουν πως ο ερωτών δεν έχει κάτσει να ασχοληθεί σοβαρά με το πρόβλημά του, στο SO πολλές φορές δε θα καταδεχτούν να τις κάνουν ούτε πατσαβούρι. Which is how it should be.

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δύο πράγματα:

 

1. Όπως βλέπεις η ερώτηση στο SO σηκώνει βελτίωση. Έχεις γίνει άπειρα downvoted κυρίως γιατί λες "έχω αυτό το πρόβλημα, βρείτε μου τη λύση" χωρίς να δείχνεις τι έχεις κάνει από την πλευρά σου για να το λύσεις μόνος σου, κάτι που θα έπρεπε να κάνεις (#1 στη λίστα βασικά).

 

Εφόσον το πρόβλημά σου είναι ότι "mysql_num_rows expects a resource, boolean given" αυτό που θα έπρεπε να κάνεις είναι να δεις τι παράμετρο της δίνεις ($query), από που προέρχεται αυτή η παράμετρος (από τη mysql_query) και να δείς από το manual πότε μπορεί αυτή να επιστρέψει boolean. Αν το έκανες αυτό θα έβλεπες κατευθείαν τι πήγε στραβά (το πρώτο παράδειγμα είναι ακριβώς αυτό που σου συμβαίνει) και θα είχες μάθει κάτι στην πορεία.

 

Έχε λοιπόν υπόψη ότι σε κανέναν δεν αρέσει να βοηθάει αυτούς που δε βοηθούν τον εαυτό τους, και ότι όσο πιο πολλά γνωρίζει κανείς τόσο λιγότερη διάθεση έχει να ασχοληθεί με τέτοιες περιπτώσεις γιατί δίνοντας μασημένη τροφή τη λύση βασικά σπαταλάει τον πολύτιμο χρόνο του. Και αντίστροφα, όσο πιο "βοηθητικές" είναι οι λύσεις που θα πάρεις τόσο πιο "επικίνδυνες" θα είναι γιατί αυτός που θα τις παρέχει δε θα γνωρίζει και πολλά ή δε θα αντιμετωπίζει το θέμα "όπως θα έπρεπε".

 

Case in point: η πολύ σωστή απάντηση ακριβώς απο πάνω δε σου λέει ότι αυτό που κάνεις είναι να ανοίγεις διάπλατα τις πόρτες για να "χακέψει" κανείς την εφαρμογή σου με ένα απλό SQL injection. Υπάρχουν έτοιμα προγράμματα που το κάνουν.

 

2. SQL injection. Μάθε και διόρθωσε. Και κάνε πολλά κλικ στις "related" questions στα δεξιά των σελίδων στις οποίες έκανα link.

 

Και κάτι τελευταίο, άσχετο με το συγκεκριμένο σου πρόβλημα.

 

Το StackOverflow είναι απίστευτο εργαλείο, αλλά πρέπει να το μεταχειρίζεσαι με σεβασμό. Ερωτήσεις που στο insomnia θα απαντηθούν παρόλο που είναι ελλιπώς διατυπωμένες ή δείχνουν πως ο ερωτών δεν έχει κάτσει να ασχοληθεί σοβαρά με το πρόβλημά του, στο SO πολλές φορές δε θα καταδεχτούν να τις κάνουν ούτε πατσαβούρι. Which is how it should be.

Έχεις απόλυτο δίκιο σε αυτό που λες, αλλά απ' ότι φαίνεται στόχος του παιδιού δεν είναι τόσο να μάθει παρά να βγάλει μία άσκηση. Και κακός δίνουνε τέτοιες ασκήσεις στις σχολές χωρίς να έχουν κάνει τα βασικά για τις βάσεις δεδομένων, γιατί πολύ απλά δεν θα τους ωφελήσει σε τίποτα.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχεις απόλυτο δίκιο σε αυτό που λες, αλλά απ' ότι φαίνεται στόχος του παιδιού δεν είναι τόσο να μάθει παρά να βγάλει μία άσκηση. Και κακός δίνουνε τέτοιες ασκήσεις στις σχολές χωρίς να έχουν κάνει τα βασικά για τις βάσεις δεδομένων, γιατί πολύ απλά δεν θα τους ωφελήσει σε τίποτα.

 

Πολύ καλά τα λες (και by the way ευχαριστώ που δεν πήρες στραβά αυτό που έγραψα).

 

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

 

If something is worth doing, it's worth doing right.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...