[solved] Insert μεταβλητού αριθμού πεδίων

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

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

Απάντηση
Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από Apostolis_38 » 13 Δεκ 2009 12:33

freestuffίτες καλημέρα,

προσπαθώ να φτιάξω ένα insert στο στύλ του phpMyadmin.
Δηλαδή να μπορείς να καταχωρείς στοιχεία χωρίς να έχεις κάποια φόρμα για κάθε ένα πίνακα συγκεκριμένα αλλά μία φόρμα που να "παίζει" σε όλους. Είτε έχει 1 field είτε 50.

Εδώ φτιάχνω τη φόρμα καταχώρησης των στοιχείων:

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

//---------------------------------ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΩΝ ΤΟΥ ΠΙΝΑΚΑ---------------------------------//
$query = "SELECT * FROM ".$t." ";
$result = mysql_query($query);
$num_results = mysql_num_rows($result);



//------------------------------ΦΟΡΜΑ ΚΑΤΑΧΩΡΗΣΗΣ ΣΤΟΙΧΕΙΩΝ---------------------------------//

?>
<form action="φόρμα.php" method="post">
<table width="100%" height="100%" cellpadding="0" cellspacing="4" border="0">
<?php
$field = mysql_num_fields&#40;$result&#41;;
  for &#40;$i = 0; $i < $field; $i++ &#41;
    &#123;
//--------------------------------ΕΚΤΥΠΩΣΗ HEADER ΤΟΥ ΠΙΝΑΚΑ--------------------------------//
?>
<tr bgcolor="#999999">
<td width="10%" align="left" bgcolor="#CCCCCC">
<?php
echo "&nbsp;".trim &#40;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41; &#41;."&nbsp;&nbsp;\n";
?></td>
<td width="40%"  bgcolor="#CCCCCC" align="left">
<?php
//---------ΑΝ ΤΟ ΠΕΔΙΟ ΕΙΝΑΙ ΟΤΙΔΗΠΟΤΕ ΕΚΤΟΣ ΑΠΟ BLOB &#40;TEXT/TINYTEXT/MEDIUMTEXT&#41;---------//
  if &#40;mysql_field_type&#40;$result, $i&#41; != "blob"&#41;
    &#123;
?>
<input name="<?php echo trim &#40;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41; &#41;;?>" type = "text" size="62">
<?php
    &#125;
  else
    &#123;
//--------------------------------ΑΝ ΤΟ ΠΕΔΙΟ ΕΙΝΑΙ BLOB---------------------------------//
?>
<textarea name="<?php echo trim &#40;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41; &#41;;?>" cols="80" rows="10"></textarea>
<?php
	&#125;
?>
<td width="44%" align="justify">
<?php
//--------------------------------ΑΝ ΤΟ ΠΕΔΙΟ ΕΙΝΑΙ AUTO INCREMENT---------------------------------//
$check = mysql_field_flags&#40;$result, $i&#41;;
if &#40;strstr &#40;$check,"auto_increment"&#41; &#41;
  &#123;
?>
<font color="#FF0000">Το πεδίο έχει αυτόματη αρίθμηση. Είναι καλύτερο να μην δώσετε στοιχεία.</font>
<?php
  &#125;
?>
</td>
</tr>
<?php
    &#125;
?>
</table>
<br />
<input type="hidden" name="t" value="<?php echo trim &#40;$t&#41;;?>" />
<input type="submit" value="ΚΑΤΑΧΩΡΗΣΗ ΕΓΓΡΑΦΗΣ" />
</form>
<br />
Επειτα παίρνω τα data στην σελίδα που κάνει την καταχώρηση:

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

//-----------------ΔΗΛΩΣΗ ΜΕΤΑΒΛΗΤΩΝ ΠΟΥ ΘΑ ΧΡΗΣΙΜΟΠΟΗΘΟΥΝ-----------------//
$t = trim &#40;$_POST&#91;"t"&#93;&#41;;


//--------------------------ΕΛΕΓΧΟΣ ΣΥΝΔΕΣΗΣ ΚΑΙ ΧΡΗΣΗ ΤΗΣ ΒΑΣΗΣ--------------------------//
require &#40;"σύνδεση.php"&#41;;

//---------------------------------ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΩΝ ΤΟΥ ΠΙΝΑΚΑ---------------------------------//
$query = "SELECT * FROM ".$t." ";
$result = mysql_query&#40;$query&#41;;
$num_results = mysql_num_rows&#40;$result&#41;;

$field = mysql_num_fields&#40;$result&#41;;
  for &#40;$i = 0; $i < $field; $i++ &#41;
    &#123;
$data = $_POST&#91;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;&#93;;
Μέχρι εδώ όλα καλά. Τα δεδομένα έρχονται κανονικά.
Το πρόβλημα είναι μετά:

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

//----------------------------------ΕΙΣΑΓΩΓΗ ΕΓΓΡΑΦΗΣ----------------------------------//
$query1 = "INSERT INTO ".$t." VALUES &#40;".$data."&#41; ";
echo $query1."<br>";
$result1 = mysql_query&#40;$query1&#41;;
    &#125;
Στο VALUES
Κανονικά θα έπρεπε να είναι σε στύλ (".$data.",".$data.",".$data.",".$data.") κ.λ.π.
Στην μορφή που είναι τώρα δημιουργείται εγγραφή αλλά "περνάει" μόνο το πεδίο που είναι auto increment. Τα υπόλοιπα είναι null.

Πως μπορώ να δηλώσω τόσες φορές το VALUES όσα και τα πεδία του πίνακα;
Καμμιά ιδέα;
Τελευταία επεξεργασία από το μέλος Apostolis_38 την 14 Δεκ 2009 14:08, έχει επεξεργασθεί 1 φορά συνολικά.

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

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από korgr » 13 Δεκ 2009 19:22

Αποστολη, μπορει να φταιει που ειμαι ζαλισμενος (μολις γυρισα απο ΣΚ στην Αθηνα), αλλα μπορεις να μου εξηγησεις τι κανει αυτη η γραμμη?

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

$data = $_POST&#91;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;&#93;;
Σου υπενθυμιζω πως η $field_name ειναι ο πινακας που περιεχει τα inputs του χρηστη.
Απο την αλλη η

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

$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;
ειναι εντολη αναθεσης οπου προσθετει στα οποια περιεχομενα του πινακα $field_name και τα ονοματα των πεδιων του mysql πινακα.
Ειναι δηλαδη σαν ο $field_name να εχει περιεχομενα πχ
  • 10
    Paul
    Athens
    167
    2107859582
τυχαιες τιμες απο τα Input του χρηστη, και μετα να γινεται:
  • 10
    Paul
    Athens
    21500
    2107859582
    id
    name
    city
    zipcode
    phone
να προσθετεις δηλαδη στις τιμες τις φορμας, και τα ονοματα των πεδιων της mysql

Απο την αλλη αυτη την αναθεση την εχεις σαν δεικτη του πινακα $_POST

Εκτος αν ειμαι τοσο ζαλισμενος επαναλαμβανω, που να μην ξερω τι λεω (οποτε συγχωρα με και αγνοησε με) :D

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από Apostolis_38 » 13 Δεκ 2009 20:28

Αμα ζαλίστηκες με ένα ΣΚ φαντάσου τι τραβάμε εμείς τόσα χρόνια :D


Λοιπόν,
το

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

&#91;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;&#93;;
μαζί με το for που υπάρχει προηγουμένως βρίσκει το name του κάθε table field.
Δηλαδή (π.χ.) id, invoice, inv_date, company κ.λ.π. Τα fields δηλαδή που "δηλώνεις" όταν φτιάχνεις τον πίνακα.

Αυτή τη διαδικασία τη χρησιμοποιώ για να βρώ τα ονόματα των fields, για να τα δηλώσω σαν name στη φόρμα αποστολής των δεδομένων και να τα δηλώσω σαν μεταβλητές που περιέχουν τα δεδομένα με την POST.
Το $data το χρησιμοποιώ για να μην γράφω όλο αυτό το μακρυνάρι μέσα στο INSERT.

Μέχρι εκεί δουλεύει κανονικά. Φέρνει τα data κανονικά.
Το πρόβλημα είναι στο VALUES.
Αν ο πίνακας έχει 3 πεδία και δηλώσω

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

VALUES &#40;'".$data."','".$data."','".$data."'&#41;
η εγγραφή περνάει κανονικότατα.
Αλλά φυσικά έτσι αχρηστεύεται όλη η "ιδέα".

Σκέφτομαι να δοκιμάσω άλλο τρόπο γιατί έτσι δεν μπορώ να το καταφέρω.
Μάλλον θα δημιουργώ πρώτα την εγγραφή και μετά θα εμφανίζω φόρμα καταχώρησης που ουσιαστικά θα είναι update κι όχι insert.
Για μεμονωμένο field το έχω κάνει.
Για πολλά... είδωμεν.


Υ.Γ.
Επίσης πιθανών να πρόσεξες οτι το for κλείνει μετά το $query1.
Ούτε αυτό είναι το πρόβλημα.
εχω δοκιμάσει και πρίν το query1.
Το πρόβλημα είναι καθαρά στο VALUES.
Κι όταν πάω να "κόψω" το INSERT και να βάλω κι εκεί ένα for ή foreach, απλά δεν δουλεύει.
:evil:

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

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από korgr » 13 Δεκ 2009 21:08

Αν θες βοηθαμε να καταλαβω κατι
αν το

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

 for &#40;$i = 0; $i < $field; $i++ &#41;
    &#123;
$data = $_POST&#91;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;&#93;;
το κανεις

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

 for &#40;$i = 0; $i < $field; $i++ &#41;
    &#123;
$data = $_POST&#91;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;&#93;;
echo&#40;$data."<br/>"&#41;;
τι εξοδο σου δινει?
Μπορεις να postαρεις ενα δειγμα?

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από Apostolis_38 » 13 Δεκ 2009 21:23

Τα δεδομένα που εισάγει ο χρήστης.

Ανεβάζω και εικόνα για να δείς.
Σε πίνακα που εχει τρείς γραμμές πάει να περάσει δυο data επειδή το πρώτο πεδίο το αφήνω κενό μιας και είναι auto increment. Αν δώσω μόνος μου id θα το εμφανίζει κανονικά .
Συνημμένα
Screenshot.png

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από Apostolis_38 » 13 Δεκ 2009 21:26

Ορίστε και η φόρμα καταχώρησης.
Συνημμένα
Screenshot1.png

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

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από korgr » 13 Δεκ 2009 22:08

Ωραια!
Το αποτελεσμα σε δικαιωνει οποτε πραγματι ημουν ζαλισμενος :lol:
Απο την στιγμη που η $data εχει σε καθε loop τα σωστα στοιχεια, προτεινω:

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

$data="";
 for &#40;$i = 0; $i < $field; $i++ &#41;&#123;
$data. = "'".$_POST&#91;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;&#93;."', ";
 &#125;
$data=substr&#40;$data, 0, -2&#41;; // εξω το τελευταιο κομμα...
$query1 = "INSERT INTO ".$t." VALUES &#40;".$data."&#41; ";
$result1 = mysql_query&#40;$query1&#41;;
   
δεν το δοκιμασα αλλα λογικα θα κανει τη δουλεια...
Η θεωρια:
Κτιζουμε την $data με ολες τις μεταβλητες χωρισμενες με κομμα ωστε να ειναι στη μορφη που τις περιμενει η insert

Παντως θα πρεπει και η id να υπαρχει (εστω ως "",) για να ισχυσει η σωστη σειρα των πεδιων.

Η ενσταση μου ομως ειναι η εξης:
Αυτο που κανεις το κανει και το phpMyAdmin ok.
Για να ειναι χρηστικο θα πρεπει να γινει ακομα πιο εξυπνο και να μην περιοριζεται σε textfields αλλα να μπορει να ξεχωριζει (με ενα βοηθητικο πινακα) αν μια εγγραφη ειναι textarea, textfield, checkbox ή select (με αυτα καλυπτεις ολες τις περιπτωσεις), με τα select να γινονται fill απο τα σχεσιακα tables (πχ countries, ΝΑΙ/ΟΧΙ, flags κλπ)

Αυτο εχω κανει εγω τουλαχιστον στο δικο μου αυτοματο admin panel :)

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από Apostolis_38 » 13 Δεκ 2009 23:15

- Δυστυχώς δεν δούλεψε. Πάντως κάποιος τρόπος πρέπει να υπάρχει, δεν μπορεί.

- Το id δουλεύει μια χαρά. Είτε σαν auto increment οπότε δεν χρειάζεται να δώσεις στοιχεία είτε δίνοντας το μόνος σου.

- Αυτά που γράφεις για τους επιπλέον ελέγχους είναι σωστά αλλά πρέπει πρώτα να λύσω αυτό το πρόβλημα.
Το add record είναι από τα βασικότερα.

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

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από korgr » 14 Δεκ 2009 08:49

Επιμενω και δεν τα παραταω :lol:

Δοκιμασε debuging με echo:

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

$data="";
 for &#40;$i = 0; $i < $field; $i++ &#41;&#123;
$data. = "'".$_POST&#91;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;&#93;."', ";
 &#125;
$data=substr&#40;$data, 0, -2&#41;; // εξω το τελευταιο κομμα...
$query1 = "INSERT INTO ".$t." VALUES &#40;".$data."&#41; ";

echo&#40;$query1&#41;; // debug για να δουμε πως φορμαρεται η $query1 πριν εκτελεστει...

$result1 = mysql_query&#40;$query1&#41;; 

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από Apostolis_38 » 14 Δεκ 2009 11:06

Οκ, αφού επιμένεις. :D

Κατ' αρχάς χτυπάει στην τελεία μετά το $data (

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

$data. =
) και αναγκαστικά το βγάζω.

Οπότε έχουμε:

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

$data="";
$field = mysql_num_fields&#40;$result&#41;;
 for &#40;$i = 0; $i < $field; $i++ &#41;&#123;
echo $data = "'".$_POST&#91;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;&#93;."', ";
echo "<br>";
 &#125;
$data=substr&#40;$data, 0, -2&#41;; // εξω το τελευταιο κομμα...


//----------------------------------ΕΙΣΑΓΩΓΗ ΕΓΓΡΑΦΗΣ----------------------------------//
$query1 = "INSERT INTO ".$t." VALUES &#40;".$data."&#41; ";
echo&#40;$query1&#41;; // debug για να δουμε πως φορμαρεται η $query1 πριν εκτελεστει...
$result1 = mysql_query&#40;$query1&#41;;
Σου ανεβάζω φωτό με το echo $query1:
Συνημμένα
test.jpg

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

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από korgr » 14 Δεκ 2009 11:41

Αμα βγαλεις την τελεια το χασαμε το κορμι Πατριωτη, γιατι ειναι το append
Το λαθος ηταν δικο μου που ειχα κενο μεταξυ τελειας και ισον!
Καντο ετσι και πες μου την ιδια echo:

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

$data="";
 for &#40;$i = 0; $i < $field; $i++ &#41;&#123;
$data.= "'".$_POST&#91;$field_name&#91;&#93;=mysql_field_name&#40;$result,$i&#41;&#93;."', ";
 &#125;
$data=substr&#40;$data, 0, -2&#41;; // εξω το τελευταιο κομμα...
$query1 = "INSERT INTO ".$t." VALUES &#40;".$data."&#41; ";

echo&#40;$query1&#41;; // debug για να δουμε πως φορμαρεται η $query1 πριν εκτελεστει...

$result1 = mysql_query&#40;$query1&#41;;

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από Apostolis_38 » 14 Δεκ 2009 11:48

ΕΙΣΑΙ ΘΕΟΣ
Συνημμένα
image1.jpg

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από Apostolis_38 » 14 Δεκ 2009 11:49

Ολα ok! :pint:
Συνημμένα
image2.jpg

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

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από korgr » 14 Δεκ 2009 12:21

Απο τη στιγμη που καταφερες να εχεις στην $data, σε καθε loop, μια απο τις inserted τιμες, ηταν απλα θεμα χρονου να το κανουμε να δουλεψει.
Και να θυμασαι πως ολα μας δουλευουν οκ, μεχρι να παρουσιαστει το επομενο που δεν θα δουλευει και θα αρχισουμε το κυνηγι του debuging :lol:

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

[solved] Insert μεταβλητού αριθμού πεδίων

Δημοσίευση από Apostolis_38 » 14 Δεκ 2009 12:51

Μπορεί να είμαι βιτσιόζος αλλά και το debuging είναι μέσα στις χαρές του επαγγέλματος :P

Δύο πραγματάκια, αν μπορείς.

- Αν κατάλαβα καλά ενώνουμε όλα τα data που παίρνουμε απο την POST σε ένα string και μετά πάλι τα σπάμε στην αρχική τους μορφή κάθε φορά η php καταχωρεί κατά ένα πεδίο μετά το κόμμα. Σωστά;
Και πως "καταλαβαίνει" η php πως πρέπει να εκτελέσει το insert (π.χ.) 3 φορές;
Αφού το query τρέχει μία φορά.

Η μήπως το καταχωρεί μία φορά και η mysql "γεμίζει" σειριακά τα πεδία με τα δεδομένα που βρίσκονται πρίν το κόμμα;


- Μπορείς να μου εξηγήσεις σε γενικές γραμμές τη λογική για τους ελέγχους βάση του βοηθητικού πίνακα που ανέφερες;
Δηλαδή το script θα κοιτάει στον βοηθητικό πίνακα και αν το πεδίο πληροί κάποια από τις προϋποθέσεις τότε θα κάνει την ανάλογη κίνηση;
Γιατί να μην γίνεται με if τάδε κάνε αυτό;

Απάντηση

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

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

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