Δυναμικοτερο insert στη mysql (με php)

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

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

Απάντηση
Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Christianago » 20 Ιούλ 2011 14:39

Εχω μια web page μεσω της οποιας ο χρηστης συμπληρωνει καποιες τιμες σε μια φορμα ή εισαγει ενα αρχειο και οι τιμες συμπληρωνονται αυτοματα.
Μετα παταει υποβολη και μεσω κωδικα ajax αποθηκευει πχ. 10 τιμες σε πεδια που συμπληρωσε ο χρηστης σε ενα array
και τα στελνει στο php και μεσω array παλι τα εισαγει στη mysql σε 1 row σε 1 table.
Κλασικο και βαρετο θα μου πειτε και ολα λειτουργουν μια χαρα. Αλλα θελω να κανω λιγο πιο δυναμικο τον κωδικα...

Καποιοι πινακες στη ΒΔ εχουν πχ 50 στηλες. Ειναι χαζο να καθομαι για 50 κλειδια του array στο php να τα καταχωρω στην αντιστοιχη στηλη του πινακα της ΒΔ (ναι ετσι τα περναω μεχρι στιγμης).
Υπαρχει καποια καλυτερη ιδεα; Η ειναι εντελως λαθος το σκεπτικο μου; Καντε προτασεις δε με πειραζει να αλλαξω ολο τον κωδικα.

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Khronos » 20 Ιούλ 2011 15:55

Με την προϋπόθεση οτι τα κλειδιά του array έχουν ίδια ονόματα με αυτά των στηλών του πίνακα της βάσης σου, μπορείς με ένα for each να δημιουργήσεις το query που θα κάνει το insert ή το update.

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Christianago » 20 Ιούλ 2011 16:21

Κατι τετοιο εχω στο μυαλο μου μονο. Ειναι ο πιο γρηγορος και ασφαλης τροπος για εισαγωγη;

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

$data['VAL1'] = 1;
$data['VAL2'] = 2;
$data['VAL3'] = 3;

mysqli_query($db, "INSERT INTO tableta(ID, VAL1, VAL2, VAL3) VALUES ('', ' ', ' ', ' ')");
$lid = mysqli_insert_id($db);

$i = 1;  

foreach ($data as $value){
 
mysqli_query($db, "UPDATE tableta SET VAL$i = '$value' WHERE ID = '$lid'");
    
$i++;    
}

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Christianago » 20 Ιούλ 2011 17:00

Ενας αλλος πιο δυναμικος τροπος ειναι ο εξης. Αυτο με τα κλειδια του array που ειπες δεν καταφερα να το κανω.

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

$data[0] = 1;
$data[1] = 1;
$data[2] = 2;
$data[3] = 3;

$query = mysqli_query($db, "SELECT * FROM tableta");

while ($finfo = mysqli_fetch_field($query)) {
    
$keys[] = $finfo->name;

}   
 
mysqli_query($db, "INSERT INTO tableta VALUES ('', ' ', ' ', ' ')");
$lid = mysqli_insert_id($db);

$i = 0; 

foreach ($data as $value){

mysqli_query($db, "UPDATE tableta SET $keys[$i] = '$value' WHERE ID = '$lid'");
$i++;

}
Αν υπαρχει και καποιος αλλος πιο μοντερνος τροπος...
Επομενα, επειδη διαλεγω καθε φορα δυναμικα τον πινακα της ΒΔ υπαρχει καποιος τροπος να καθορισω το VALUES('', ' ', ' ', ' ')
ετσι ωστε να μη το γραφω χειροκινητα για καθε πινακα;

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Christianago » 20 Ιούλ 2011 17:54

Το βρηκα απλα το βαζω ετσι: INSERT INTO tableta VALUES ()
Δε βαζω καθολου στηλες ή βαζω VALUES (NULL)
Για καποιο λογο που δεν ειχα συνειδητοποιησει η mysql κανει εισαγωγη στον πινακα οταν δοθει ID ιδιο με το κλειδι σε innodb εαν το ID ειναι αυξανομενο πεδιο.
Συν του οτι φυσικα αυξανει αυτοματα το ID που παει να γινει εισαγωγη κατα 1.

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από gvre » 20 Ιούλ 2011 21:45

Christianago έγραψε:Το βρηκα απλα το βαζω ετσι: INSERT INTO tableta VALUES ()
Μην το κάνεις έτσι γιατί η εφαρμογή σου θα σταματήσει να λειτουργεί αν κάποια στιγμή στο μέλλον προσθέσεις κάποιο πεδίο στον πίνακα.
Στη MySQL μπορείς να χρησιμοποιήσεις την παρακάτω σύνταξη

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

INSERT INTO table SET field1='value1', field2='value2'

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Christianago » 20 Ιούλ 2011 21:59

Ευχαριστω για την πληροφορια. Με τον κωδικα που μου εδωσες ξαναγυρναω πισω στην αρχη.
Στο προγραμμα μου η εισαγωγη γινεται σε πινακα που καθοριζεται απο τις επιλογες του χρηστη.
Επομενως δεν ξερω σε ποιον πινακα θα εισαγει. Μονο με ξεχωριστους ελεγχους για καθε πινακα μπορω να κανω την εισαγωγη γραφοντας χειροκινητα τις στηλες τους.

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από gvre » 20 Ιούλ 2011 22:23

Λογικά κάτι τέτοιο θα κάνει αυτό που θέλεις (δεν το έχω δοκιμάσει επειδή δε χρησιμοποιώ MySQL).

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

$data['field1'] = 1;
$data['field2'] = 2;
$data['field3'] = 3;

$sql  = "INSERT INTO table SET ";
$sql .= implode("=?, ", array_keys($data)) . "=?";

$cn = new PDO("...");
$cn->beginTransaction();
$stmt = $cn->prepare($sql);
$cnt = 1;
foreach($data as &$v)
{
        $stmt->bindParam($cnt++, $v, PDO::PARAM_INT);
        $stmt->execute();
}
$cn->commit();

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Christianago » 20 Ιούλ 2011 22:35

Στη γραμμη αυτη βγαζει το λαθος

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

$cn = new PDO("mssql:host=$host;dbname=$dbname, $user, $pass");
//το αλλαξα από το δικο σου $cn = new PDO("...");
Uncaught exception 'PDOException' with message 'could not find driver'

Ειναι προφανες οτι δεν ειμαι εξοικιωμενος με τα php objects...

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από gvre » 20 Ιούλ 2011 22:54

mssql έχεις ή mysql;

Δοκίμασε αυτό για mysql

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

$cn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Christianago » 20 Ιούλ 2011 23:01

Ωραια εφτιαξε. Τωρα βγαζει το λαθος εδω:

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

$stmt->execute();
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in...

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από gvre » 20 Ιούλ 2011 23:25

Κάνε ένα var_dump($data); και στείλε το αποτέλεσμα.

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Christianago » 20 Ιούλ 2011 23:28

Όλο δικό σου! array(4) { ["ID"]=> &string(2) "11" ["VAL1"]=> &string(1) "2" ["VAL2"]=> &string(1) "3" ["VAL3"]=> &string(1) "3" }

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από gvre » 20 Ιούλ 2011 23:29

...και ένα die($sql) :)

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικοτερο insert στη mysql (με php)

Δημοσίευση από Christianago » 20 Ιούλ 2011 23:31

Το ψοφησα και μου εβγαλε αυτο:
INSERT INTO table SET ID=?, VAL1=?, VAL2=?, VAL3=?
Αναμενομενο θα ελεγα.

Απάντηση

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

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

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