διασυνδεση ενος πινακα με 2 αλλους με php user management

Γενικές συζητήσεις για SQL και SQL Servers (RDBMS)

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

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από fafos » 23 Μαρ 2011 20:14

Apostolis_38 έγραψε:Το είχα σκεφτεί κι εγώ αυτό.
Ομως κάτι δεν μου κολλάει.
Αν γράψεις null ή 0 στο user.staffid τι θα γράψεις στον άλλο πίνακα;
Υποτίθεται οτι το staff.staffid είναι το id της εγγραφής και δεν μπορεί να πάρει 0.
ti douleia exei to id tou enos me to pedio tou allou? to user.staffid h to user.studid den einai ypoxreotiko na symplhrothoun... oi alloi pinakes vazoun auto to id..

to olo lathos einai tou kathighth pou den dinei pedio sto user me ton typo-vathmo tou kathe user.. isos einai kai eskemmeno lathos gia na psaksei o student gia pio periplokous tropous epilyshs tou provlhmatos

kontopatrioth.. den vlepo n anaferei pouthena gia foreign key.. aplos anaferei "antistoixa" xoris na se ypoxreonei na ta kaneis foreign key..

ase pou to thema einai sthn sql kai oxi sthn mysql, alla apo ta prohgoumena erothmata ths mallon thn mysql ennoei.. :lol:
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από korgr » 23 Μαρ 2011 20:29

Δάσκαλε έχω έξωθεν πληροφορίες :lol:
Όπως στα λέω είναι
Θέλει foreign keys ο καθηγητής

Πάντως μιας και το έφερε η κουβέντα, και εγώ προτιμώ να χειρίζομαι τις σχέσεις με προγραμματισμό php και όχι με διασυνδέσεις sql (που σαι pimpogio να τα χώσεις lol)

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από fafos » 23 Μαρ 2011 21:26

tote dinei panta "SET NULL" sto id pou einai keno.. oute 0 (mhden), oute keno..

h diafora einai oti sta queries pou tha kalei den mporei na xrhsimopoihsei thn INNER JOIN.. mono LEFT kai RIGHT JOIN..
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από nbc » 23 Μαρ 2011 21:30

Διαβάζω, ξανα-διαβάζω, και δεν καταλαβαίνω που είναι το πρόβλημα... :think:

Μπορείς να έχεις όσα foreign keys θέλεις σε έναν πίνακα, και μπορείς να τα ορίσεις ως NULL (άσχετα από θεωρητικές αντιρρήσεις σχετικά με τα nullable foreign keys). Μα πως αλλιώς θα λειτουργούσε το "ON DELETE SET NULL" ?

Κατά συνέπεια, ισχύει αυτό που λέει ο fafos.
korgr έγραψε:Έλα μου όμως που η mysql (και σωστά) πετάει ένα φαρδύ πλατύ error επειδή θέλει στα δύο αυτά πεδία να βρει τιμές που ΥΠΑΡΧΟΥΝ ως primary keys στους άλλους δυο πίνακες;
Αν οριστούν ως NOT NULL, τότε ναι. Αλλά, στο συγκεκριμένο παράδειγμα θα πρέπει να οριστούν ως NULL.

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από korgr » 23 Μαρ 2011 21:42

nbc αυτό ήταν!
Δεν είχαν οριστεί Allow NULL γι' αυτό κτυπούσε η mySQL στο insert

Ακους Σταυρούλα?
Τα δυο ξένα κλειδια σου, ορισε τα να δεχονται NULL :P

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από pimpogio » 24 Μαρ 2011 03:11

Η σωστή λύση ειναι με foreign keys ΧΩΡΙΣ NULL τα keys ειναι μεγα λαθος να ειναι NULL

ειναι απλο δεν βλεπω που υπαρχει κολλημα..

user(usid, usename, password και access)
student(studid, usid, studfirst, studlast, studemail, studaddress, studbirth) usid -> foreign key sto user(usid)
staff (staffid, usid,stafflast) usid -> foreign key sto user(usid)

κανε και ενα normalization για να εισαι εντελως οκ

o πινακας user(usid,studid,staffid, usename, password και access)
που εχεις ειναι λαθος..

php mapping
abstract/interface user (προτιμω abstract στην συγκεκριμενη περιπτωση αν και γενικα ειμαι υπερ των interfaces στο interfaces vs class inheritance επειδη ειναι ποιο ευελικτο)
(Η κληρονομικοτητα σε classes ειναι πολυ abused στο ΟΟ programing/δεν ειναι δυνατοτητα για πασα νοσο κ μ@λ..)
student extends/implements user
staff extends/implements user

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από korgr » 24 Μαρ 2011 10:01

Ενδιαφέρουσα προσέγγιση pimpogio
Να έχουμε δηλαδή 2 φόρμες καταχώρησης, μία για φοιτητές και μια για καθηγητές, όπου να υπάρχουν και τα πεδία του πίνακα user (username, password, access) και κατά το insert να ενημερώνεται πρώτα ο πίνακας user ώστε να έχουμε το last inserted ID, και να το χρησιμοποιήσουμε ώς τιμή στο ξένο κλειδί του άλλου πίνακα (καθηγητών ή φοιτητών ανά περίπτωση). Αυτό δεν εννοείς?

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από pimpogio » 24 Μαρ 2011 11:24

αυτο εννοω και μαλιστα τα 2 inserts
πρεπει ΟΠΩΣΔΗΠΟΤΕ να γινουνε σε 1 transaction
γιατι αλλιως μπορει να γινει corrupt η βαση
δηλαδη να γινει το 1ο insert και να αποτυχει το 2ο
οποτε θελουμε transaction για ασφαλεια οτι θα εκτελεστουνε σωστα και μαζι τα 2 inserts το ενα μετα το αλλο...

Αυτο ειναι μια κλασικη σχεση IS-A (ειναι ενα)

stud IS A user / stuff IS A user

και εχεις στο καπακι ετοιμο τον πολυμορφισμό να τον χρησιμοποιήσεις
στην ιεραρχια κλασεων σε php

Αυτη η λυση ειναι μονο οταν ειναι προκαθορισμενοι οι τυποι των users του συστηματος απο πριν... που εδω ειναι..

Αν θες δυναμικα να περνει νεους τυπους users κανεις αλλα κολπα
Τελευταία επεξεργασία από το μέλος pimpogio την 24 Μαρ 2011 11:34, έχει επεξεργασθεί 1 φορά συνολικά.

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από korgr » 24 Μαρ 2011 11:29

Ένα query αυτού του τύπου για το συγκεκριμενο παραδειγμα έχεις για να μας φωτίσεις?

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από pimpogio » 24 Μαρ 2011 11:54

Mε PDO μια και ειναι το καλυτερο

Ενδεικτικο παραδειγμα / δεν κανει ο κωδικας σε κανονικη εφαρμογη γιατι ειναι 100% inline

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

<?php
$hostname = 'localhost';
$username = 'username';
$password = 'password';
$dbname = 'test';

try &#123;
    $dbh = new PDO&#40;"mysql&#58;host=$hostname;dbname=$dbname", $username, $password&#41;;
    /*** set the PDO error mode to exception ***/
    // prosoxi prepei na tsakoneis ta exceptions giati alios tha ta kserasei sto output kai the ta dei kapoios epikindinos
    $dbh->setAttribute&#40;PDO&#58;&#58;ATTR_ERRMODE, PDO&#58;&#58;ERRMODE_EXCEPTION&#41;;
    /*** begin the transaction ***/
    $dbh->beginTransaction&#40;&#41;;

    // prepared statements -> ta sql injections tou epikindinou den pianoune
    $stmt = $dbh->prepare&#40;"INSERT INTO users&#40;userid,uname,pass...&#41; VALUES&#40;&#58;uname,&#58;pass&#41;"&#41;;

    /*** bind the paramaters ***/
    $stmt->bindParam&#40;'&#58;uname', $to_uname_apo_to_post, PDO&#58;&#58;PARAM_STR&#41;;
    $stmt->bindParam&#40;'&#58;pass', $to_pass_apo_to_post, PDO&#58;&#58;PARAM_STR&#41;;

    /*** execute the prepared statement ***/
    $stmt->execute&#40;&#41;;

 // prepared statements -> ta sql injections tou epikindinou den pianoune
    $stmt = $dbh->prepare&#40;"INSERT INTO stuff&#40;staffid,userid,epitheto,...&#41; VALUES&#40;&#58;userid,&#58;epitheto&#41;"&#41;;

    /*** bind the paramaters ***/
    $stmt->bindParam&#40;'&#58;userid',$dbh->lastInsertId&#40;&#41;, PDO&#58;&#58;PARAM_INT&#41;;
    $stmt->bindParam&#40;'&#58;epitheto', $epitheto_apo_to_post, PDO&#58;&#58;PARAM_STR&#41;;

    /*** execute the prepared statement ***/
    $stmt->execute&#40;&#41;;

    /*** commit the transaction ***/
    $dbh->commit&#40;&#41;;
&#125;
catch&#40;PDOException $e&#41;
    &#123;
    /*** roll back the transaction if we fail ***/
    $dbh->rollback&#40;&#41;;

    /***  error message ***/
   // echo $e->getMessage&#40;&#41;;
   // κανε handle το exception - με καποιο μηχανισμό logging logare to sfalma και δειξε καμια error page sto user
 // enalaktika epidi einai sobaro sfalma to kaneis rethrow me katalilo exception type / minima ktlp
 // enalaktika mporeis na min exeis katholou auta ta inline try catch gia poio aplotita
 // kai na petaksei to exception mono tou gia na to tsakoseis se kapoio ipsilotero epipedo
 // i me ton kentriko exception handler pou exeis orisei 
    &#125;
?>

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από korgr » 24 Μαρ 2011 12:49

Χωρίς PDO και θεωρώντας πως έχουμε ήδη safe τις μεταβλητές μας
Δεν ισχύει το ακόλουθο;

1. LOCK TABLES users WRITE
2. insert σε users...
3. get last inserted id
4. insert σε stud or staff using the last inserted id of users
5. UNLOCK TABLES

Γιατί εγώ έτσι χειρίζομαι αυτές τις καταστάσεις
Που πονάει αυτή η μεθοδος?

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από pimpogio » 24 Μαρ 2011 13:15

σε διαφορα...
*lock ολο το table -> οχι καλο ...
*πετυχαινει το 2 αλλα αποτυγχανει το 4 insert
(timeout php/λαθος στον κωδικα/crash/κεραυνος κτλπ)
εχεις κανει corrupt την database..

οταν κανεις /insert/update/delete ktlp με πολλα queries που εξαρτωνται το ενα απο το αλλο και πρεπει
να γινουνε ολα πακετο θες transactions.

Αυτος ειναι ο σωστος τροπος...

χειρισμος foreign keys στην php μη χρηση transactions
μη χρηση prepared statments(ειδικα σε queries που εχουνε παραμετρους απο τους χρηστες)
ειναι εντελως λαθος πρακτικες

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από fafos » 24 Μαρ 2011 14:35

pimpogio... o(h) xrhsths edose ena provlhma opos tou(hs) etethei... to an eprepe na eixe to userid kai stous allous pinakes to exoume anaferei.. h o kathighths den hxere ti edine h to exei kanei epithdes gia na dokimasei alles gnoseis.. an isxyei to 2o kala kanei arkei na dosei kai tis praktikes lyseis stous spoudastes tou pou xrhsimopoioume sthn real life kai ena apo autous anafereis kai esy..

auto pou to sthrizeis?
Η σωστή λύση ειναι με foreign keys ΧΩΡΙΣ NULL τα keys ειναι μεγα λαθος να ειναι NULL
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από korgr » 24 Μαρ 2011 14:43

pimpogio έγραψε:σε διαφορα...
*lock ολο το table -> οχι καλο ...
*πετυχαινει το 2 αλλα αποτυγχανει το 4 insert
(timeout php/λαθος στον κωδικα/crash/κεραυνος κτλπ)
εχεις κανει corrupt την database..
Όλο αυτό μου θυμίζει:
Μην μπαίνετε σε αυτοκίνητο γιατί μπορεί να πεθάνετε :)

Όσο για τις κακές πρακτικές, όταν θα μπεις στον κόσμο των πραγματικών projects θα πάθεις πλάκα από το πόσες εξαιρέσεις του κανόνα θα συναντήσεις.
Για παράδειγμα, έχω συναντήσει στο παρελθόν περιπτώσεις που χρειάστηκε να διαγράφονται συγκεκριμένες εγγραφές χωρίς να πρέπει να πειραχθούν οι "συνδεδεμένες". Την περίπτωση ακριβώς δεν την θυμάμαι, αλλά το ΤΕΡΜΑ ο χειρισμός των foreign keys από την mySQL το θυμάμαι και με καίει ακόμα!
Όσον αφορά το sql injection υπάρχουν κι άλλοι τρόποι να το αντιμετωπίζει κάποιος οπότε δεν είναι πανάκεια η χρήση PDO.
Με ότι βολεύεται φυσικά ο καθένας...

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

διασυνδεση ενος πινακα με 2 αλλους με php user management

Δημοσίευση από pimpogio » 24 Μαρ 2011 15:28

τα keys δεν πρεπει να ειναι null(σε μερικα indexes δεν μπορουνε να ειναι) αυτο ειναι βασικος κανονας και ειδικα τα primary δεν μπορουνε καθολου να ειναι null...

για τα sql injections ο καλυτερος τροπος ειναι τα prepared statements σε ολες τις γλωσσες προγραματισμου οχι ειδικα μονο στην php.
τα mysql_real_escape και δεν ξερω πως τα λενε δεν ειναι σωστες λυσεις και δεν εχουνε πληρη προστασια τη βαλανε μονο και μονο την συναρτηση για συντηρηση πολυ παλιου κωδικα ασχετα που μετα την κανανε abuse οι χρηστες...

Αμα θες να βγαλεις καποιες εγγραφες χωρις
να πειραχτουνε οι συνδεδεμενες αρκει να σβησεις το fk
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
η να το εχεις ως εξης...
ALTER TABLE tbl_name ADD CONSTRAINT FOREIGN KEY fk_symbol (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) ON DELETE NO ACTION ON UPDATE NO ACTION;

1 εντολή και σκοτωνεις τα foreign keys για να κανεις τη βρωμικη δουλεια...
Μολις την κανεις τα επαναφερεις ωστε να εχεις και σιγουρια οτι ειναι οκ η βαση
Τελευταία επεξεργασία από το μέλος pimpogio την 24 Μαρ 2011 15:50, έχει επεξεργασθεί 4 φορές συνολικά.

Απάντηση

Επιστροφή στο “Βάσεις Δεδομένων και SQL - γενικά”

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

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