Από MySQL σε PDO

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

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

Απάντηση
gtsoukn
Δημοσιεύσεις: 33
Εγγραφή: 23 Ιούλ 2015 13:36

Από MySQL σε PDO

Δημοσίευση από gtsoukn » 01 Οκτ 2016 13:32

Άλλαξα την INSERT σε:

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

$stmt = $db->prepare('INSERT INTO table (field1, field2, field3, field4, field5) VALUES (?,?,?,?,?)');
$stmt->execute(array($field1, $field2, $field3, $field4, $field5));
και δουλεύει σωστά τοπικά και online.
Αν κατάλαβα καλά, αυτός ο κώδικας δεν "διαβάζει" το db.php


Χωρίς ιδιαίτερο νόημα η ερώτηση: Γιατί αυτή η διαφορά στη λειτουργία του XAMPP με το online;
Το έχω παρατηρήσει και σε άλλη περίπτωση αλλά δεν ασχολήθηκα μιας και η διαφορετική λειτουργία εμφανιζόταν ανάποδα.
Ο ίδιος κώδικας παρουσίαζε σφάλμα τοπικά (XAMPP) αλλά λειτουργούσε σωστά στο online.

Σημείωση: Όταν λέω ότι "δουλεύει σωστά", το λέω κρίνοντας από το αποτέλεσμα και στο ότι στο logs δεν καταγράφεται κανένα σφάλμα (error ή warning).
Γιώργος

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Από MySQL σε PDO

Δημοσίευση από jpk » 01 Οκτ 2016 21:30

Γεια σου gtsoukn,
Είναι πολύ θετικό που βρήκες άλλη λύση , και μόνος σου (καθώς η DB απλά extends το PDO).

@fafos το κεντρικό νόημα αυτής της κλάσης είναι με μια απλή μέθοδο (την request) να κάνουμε σχεδόν τα πάντα με την βάση (στο 99% των περιπτώσεων) , θα μπορούσε να γίνεται έλεγχος αν είναι UPDATE ή INSERT αλλά δεν βρήκα τον λόγο (το είχα δοκιμάσει και ο έλεγχος καθυστερούσε κάτι απειροελάχιστα δέκατα χιλιοστού του δευτερολέπτου). Το php manual http://php.net/manual/en/pdostatement.fetchall.php σαφέστατα λέει (An empty array is returned if there are zero results to fetch, or FALSE on failure) δεν ρίχνει PDOException αν το statement χρησιμοποιήθηκε για INSERT ή UPDATE.

Ψάχνοντας βρήκα αυτό το bug της PHP από το 2007 και την έκδοση 5.2.1 που εξηγεί τι συνέβαινε:
https://bugs.php.net/bug.php?id=40935

Φυσικά επειδή ήταν βασικό έχει λυθεί από τότε στο CVS (όπως θα δείτε στο τελευταίο μήνυμα του bug report) και φαντάζομαι ότι οι νεώτερες εκδόσεις της PHP είχαν από τότε ενσωματώσει την λύση αυτού του bug.

Η απάντηση gtsoukn σχετικά με τις διαφορές τοπικά και στον server , είναι τι έκδοση PHP έχεις τοπικά και τι έχεις στο server (το ίδιο ισχύει σε μικρότερο βαθμό και για την MySQL)

gtsoukn
Δημοσιεύσεις: 33
Εγγραφή: 23 Ιούλ 2015 13:36

Από MySQL σε PDO

Δημοσίευση από gtsoukn » 02 Οκτ 2016 14:19

Καλημέρα.

Μετά την εισαγωγή δεδομένων και ανέβασμα αρχείων ήρθε η σειρά του edit (διόρθωση των στοιχείων).

Η form για τη διόρθωση των στοιχείων είναι πανομοιότυπη με αυτή της εισαγωγής, με τη διαφορά της εμφάνισης των ήδη καταχωρημένων στοιχείων μόνο για τα δεδομένα κειμένου. Η "δήλωση" του αρχείου για ανέβασμα είναι ακριβώς ίδια. Συγκεκριμένα:
Φόρμα εισαγωγής (insert.php)

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

<form method="post" action="insert_db.php" enctype="multipart/form-data">
	...
	<label for="field1">Όνομα*&#58;</label>
	<input type="text" id="field1" name="field1" required aria-required='true'/>
	...
	<label for="Icon">Εικονίδιο&#58;</label>
	<input type="file" name="Icon" id="Icon">
	...
</form>
Φόρμα διόρθωσης (edit.php)

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

<form method="post" action="edit_db.php" enctype="multipart/form-data">
	<label for="field1">Όνομα*&#58;</label>
	<input type="text" id="field1" name="field1" value="<?= $field1_old ?>" required aria-required='true'>
...
	<label for="Icon">Εικονίδιο&#58;</label>
	<input type="file" name="Icon" id="Icon">
</form>
Τα αρχεία που καλούνται για την εισαγωγή και τη διόρθωση είναι insert_db.php και edit_db.php αντίστοιχα.
Στο edit_db.php το INSERT έγινε UPDATE

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

$stmt = $db->prepare&#40;'UPDATE table SET field1 = ?, field2 = ?, field3 = ?, field4 = ?, field5 = ?, field6 = ?, field7 = ? WHERE ID = ?'&#41;;
$stmt->execute&#40;array&#40;$field1, $field2, $field3, $field4, $field5, $field6, $field7, $ID&#41;&#41;;
Μέχρι εδώ όλα καλά.

Πάμε τώρα στο ανέβασμα του αρχείου.
Όπως προείπα, ο κώδικας είναι από εδώ: http://www.w3schools.com/php/php_file_upload.asp
Επιπλέον πρόσθεσα έναν έλεγχο για το αν έχει "δηλωθεί" αρχείο για ανέβασμα που τον βρήκα εδώ: http://stackoverflow.com/questions/2643 ... for-upload

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

if&#40;!isset&#40;$_FILES&#91;'Icon'&#93;&#41; || $_FILES&#91;'Icon'&#93;&#91;'error'&#93; == UPLOAD_ERR_NO_FILE&#41; &#123;
	echo "Δεν επιλέχθηκε αρχείο";
&#125; else &#123;
	// Ο κώδικας για το ανέβασμα του αρχείου
&#125;
Αυτός ο έλεγχος λειτουργεί σωστά στο insert_db.php

Ακριβώς το ίδιο (έλεγχος και ανέβασμα αρχείου) έβαλα και στο edit_db.php
Εδώ όμως, σε κάθε περίπτωση, μου λέει ότι δεν επιλέχθηκε αρχείο.
Για να δω μήπως κάτι δεν πάει καλά με τον έλεγχο, τον ακύρωσα και μου βγάζει σφάλμα ότι δεν "αναγνωρίζει" τη μεταβλητή Icon
Notice: Undefined index: Icon in /var/www/vhosts/***.gr/test.***.gr/edit_db.php on line 113
Notice: Undefined index: Icon in /var/www/vhosts/***.gr/test.***.gr/edit_db.php on line 129

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

$iconname = basename&#40;$_FILES&#91;"Icon"&#93;&#91;"name"&#93;&#41;; // Γραμμή 113
if &#40;$_FILES&#91;"Icon"&#93;&#91;"size"&#93; > 50000&#41; &#123; //Γραμμή 129
Να σημειώσω ότι η εφαρμογή απαιτεί το εικονίδιο να έχει το ίδιο όνομα με το πεδίο "Όνομα".
Έτσι, αμέσως μετά την UPDATE και πριν το ανέβασμα του αρχείου κάνω rename του υπάρχοντος αρχείου εφόσον το παλιό και το νέο όνομα είναι διαφορετικά

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

<?php if&#40;$onoma_old == $onoma_new&#41; &#123; ?>
	<table>
		<tr><td>Δεν απαιτείται μετονομασία ...</td></tr>
	</table>
<?php &#125; else &#123;
	// Rename icon file
	rename&#40;"$onoma_old.bmp","$onoma_new.bmp"&#41;;
?>
Πού είναι το λάθος;

Υ.Γ. Ελπίζω να έδωσα όλα τα απαραίτητα στοιχεία.
Γιώργος

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

Από MySQL σε PDO

Δημοσίευση από fafos » 02 Οκτ 2016 16:53

to onoma $onoma_old.bmp pos to pairneis kai to pairneis prin anevaseis to arxeio?
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

gtsoukn
Δημοσιεύσεις: 33
Εγγραφή: 23 Ιούλ 2015 13:36

Από MySQL σε PDO

Δημοσίευση από gtsoukn » 02 Οκτ 2016 20:58

Μάλλον έτσι όπως τα έγραψα σε μπέρδεψα.

Από τη λίστα εγγραφών του πίνακα παίρνω αυτή που θέλω να επεξεργαστώ. Από εδώ παίρνω το ID της εγγραφής.
Το edit_db.php είναι ως εξής:

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

// Εύρεση του πεδίου "Όνομα" βάσει του ID.
$Cat = $db->request&#40;'SELECT onoma FROM table WHERE ID = ?', array&#40;$ID&#41;&#41;;
$onoma_old = $Cat&#91;0&#93;&#91;'onoma'&#93;;

// Get new values &#40;από το form του edit.php&#41;
$onoma_new = $_POST&#91;'field1'&#93;; // Το $onoma_new είναι ένα από τα $field στην UPDATE
...

// Update DB
$stmt = $db->prepare&#40;'UPDATE table SET field1 = ?, field2 = ?, field3 = ?, field4 = ?, field5 = ?, field6 = ?, field7 = ? WHERE ID = ?'&#41;;
$stmt->execute&#40;array&#40;$field1, $field2, $field3, $field4, $field5, $field6, $field7, $ID&#41;&#41;;
...
<?php if&#40;$onoma_old == $onoma_new&#41; &#123; ?>
   <table>
      <tr><td>Δεν απαιτείται μετονομασία ...</td></tr>
   </table>
<?php &#125; else &#123;
   // Rename icon file
   rename&#40;"$onoma_old.bmp","$onoma_new.bmp"&#41;;
?>
...
// Ακολουθεί ο κώδικας για το ανέβασμα του αρχείου.
Υ.Γ. fafos επειδή δεν είσαι υποχρεωμένος να έχεις διαβάσει όλα τα post μου, είμαι κατά των έμμεσων διαφημίσεων και γι' αυτό δεν αναφέρω δημόσια το site και δεν παραθέτω ακριβώς τον κώδικα.
Γιώργος

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

Από MySQL σε PDO

Δημοσίευση από fafos » 03 Οκτ 2016 14:34

dokimase na kaneis to rename afou anevaseis ro arxeio kai ston fakello pou to exeis anevasei (p.x. rename("fakellos/".$onoma_old.bmp,"fakelos/".$onoma_new.bmp);
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

gtsoukn
Δημοσιεύσεις: 33
Εγγραφή: 23 Ιούλ 2015 13:36

Από MySQL σε PDO

Δημοσίευση από gtsoukn » 04 Οκτ 2016 14:59

Καλημέρα.

Το έκανα έτσι και δουλεύει.
Αλλά κι έτσι, κακώς δουλεύει αν υποθέσουμε ότι η rename δημιουργεί το πρόβλημα.
Με κάνει να πιστεύω ότι κάποιο λάθος υπάρχει στον αρχικό τρόπο.

Όπως είπα, το αρχείο εικόνας πρέπει να έχει το ίδιο όνομα με το πεδίο onoma.
Και τα αρχεία που ανεβάζω δεν είναι ένα αλλά πέντε, 3 αρχεία εικόνας και 2 ήχου. Επιπλέον, ένα από τα αρχεία εικόνας που ανεβάζω μετατρέπεται σε άλλες μορφές και διαστάσεις. Όλα πρέπει να είναι με όνομα αρχείου το onoma.
Τα αρχεία που ανεβάζω μπορεί να είναι με οποιοδήποτε όνομα αρχείου, π.χ. image.bmp ή voice.wav. Αυτά, με το που ανεβαίνουν (και στο insert και στο edit) μετονομάζονται στο όνομα που πρέπει.


Ο κώδικας (ας πούμε ότι είναι το λογικό διάγραμμα)

Στην αρχή του κώδικα, όλα τα πεδία παίρνουν την τιμή *_old, π.χ. $onoma_old. Οι νέες τιμές έχουν τιμή *_new, π.χ. $onoma_new.

Με τον αρχικό τρόπο:
1. Η ΒΔ ενημερώνεται με τα νέα στοιχεία ($onoma_new κλπ)
2. Αν αλλάξει το onoma ($onoma_old <> $onoma_new), όλα τα αρχεία εικόνας και ήχου που ήδη υπάρχουν μετονομάζονται σε $onoma_new
3. Ανεβαίνουν τα νέα (αν δοθούν) και αντικαθιστούν τα αντίστοιχα παλιά.

Με το νέο τρόπο:
1. Η ΒΔ ενημερώνεται με τα νέα στοιχεία ($onoma_new κλπ)
2. Ανεβαίνουν τα νέα αρχεία (αν δοθούν*) και μετονομάζονται σε π.χ. $onoma_new.bmp
* Να σημειώσω εδώ ότι ενδεχομένως να αλλάξουν μερικά μόνο αρχεία και όχι όλα. Άρα απαιτείται έλεγχος για το αν δόθηκε νέο αρχείο. Αν γίνει μετονομασία σε όλα τα αρχεία τότε τα παλιά αρχεία θα αντικαταστήσουν τα νέα.
3. Μετονομασία αρχείων (επί 5 μιας και 5 είναι τα αρχεία)
Έλεγχος αν δόθηκε νέο αρχείο.
Αν ναι, διαγραφή του $onoma_old
Αν όχι, μετονομασία του $onoma_old σε $onoma_new


Όπως λέω και στην αρχή, αν από μόνη της η rename προκαλεί την "απώλεια" των αρχείων δεν θα έπρεπε να συμβαίνει το ίδιο και στο νέο τρόπο;
Και εδώ παρεμβάλλεται η rename.

Τα αρχεία με το νέο τρόπο τα έχω ήδη φτιάξει και δουλεύει.
Φοβάμαι όμως μήπως με τόσες συνθήκες μου έχει ξεφύγει κάτι και χαθούν δεδομένα.
Θα ήθελα να επαναφέρω τον αρχικό τρόπο αν γίνεται.
Τα σχετικά αρχεία είναι διαθέσιμα αν νομίζεται ότι θα βοηθήσουν.

Ευχαριστώ.
Γιώργος

Απάντηση

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

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

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