Elxis CMS Forum

Ελληνικό Forum => Δημόσιο Βήμα => Topic started by: intefix on April 03, 2014, 15:49:42

Title: Εισαγωγή εγγραφής σε parent/child πίνακες
Post by: intefix on April 03, 2014, 15:49:42
Για χαρά...είμαι σε ένα πολυχρηστικό περιβάλλον και έχω 2 πίνακες στη MySQL που αφορούν ένα πράγμα. πχ Τιμολόγια, Υλικά Τιμολογίου. Ποιος είναι ο πιο σωστός και ασφαλής τρόπος σε PHP να γράψω στους πίνακες; Οι πίνακες είναι σε INODB με ξένο κλειδί. Να κλειδώνω τους πίνακες; να βάλλω Commit, Rolover; και ταυτόχρονη διασφάλιση απο περίεργους χαρακτήρες για προστασία της βάσης μου;
Ευχαριστώ.
Title: Re: Εισαγωγή εγγραφής σε parent/child πίνακες
Post by: datahell on April 03, 2014, 22:36:39
Προσωπικά στο Elxis δεν χρησιμοποιώ foreign keys αλλά αντ' αυτού μεταφέρω όλη την λειτουργικότητα στην php γιατί θέλω οι πίνακες και τα queries να είναι όσο γίνεται απλούστερα για μέγιστη συμβατότητα με native sql. Ο πιο σωστός τρόπος στην περίπτωσή σου εξαρτάται από την εφαρμογή σου. Αν αυτοί οι πίνακες επεξεργάζονται ταυτόχρονα από πολλούς χρήστες το lock μπορεί να προκαλέσει κάποιο query να αποτύχει. Από την άλλη είναι πιο απλός τρόπος αν έχεις 1 ή λίγους χρήστες. Νομίζω ότι τα transactions με commit/rollback είναι καλύτερη επιλογή για σένα. Όσο για την php χρησιμοποίησε PDO δαγκωτό όπως κάνουμε και στο Elxis. Για το filtering χρησιμοποίησε τις συναρτήσεις filter_input και filter_var της php. Για ακόμα πιο ειδικό filtering οι preg_replace και preg_match είναι μονόδρομος. Αναλόγως των πεδίων χρησιμοποιείς τα κατάλληλα patterns ή φίλτρα για τις filter_input/filter_var. Δεν είμαι γκουρού στις βάσεις δεδομένων οπότε ψάξτο και αλλού αν θες αν και νομίζω ότι έχω δίκιο. Για την php ότι θες εδώ είμαστε και έχουμε μεγάλη εμπειρία σε τέτοια πράγματα. Σημείωσε ότι το Elxis χρησιμοποιεί PDO με πλήρη υποστήριξη σε transactions.

$db = eFactory::getDB();
$db->beginTransaction();
$db->exec(...);
if (!$db->commit()) { $db->rollBack(); }

Και με prepared statements:
$db = eFactory::getDB();
$db->beginTransaction();
$stmt = $db->prepare(....);
$stmt->execute();
if (!$db->commit()) { $db->rollBack(); }