Avatar billede hagler Nybegynder
16. august 2005 - 16:10 Der er 31 kommentarer og
1 løsning

sjov kombinering af array's samt mysql

jeg har en tabel hvor min Kolonner kan varierer og vil gerne have udskrevet alle mine poster, med en bestemt formatering alt efter hvilket slaks felt det er i min database.

jeg kan få alle mine kolonner, samt type ud i et array med "SHOW COLUMNS" (http://dk2.php.net/distributions/manual/php_manual_da.html.gz#function.mysql-list-fields)

og liste alle mine poster med en normal select query. men nu kommer det sjove at alle mine kolenner skal skal udskrives på en ftpside som en form der kan udfyldes og postes, hvor efter dataerne sendes til databasen.

Er der nogle der kan klare den, det giver gode Point
Avatar billede nielle Nybegynder
16. august 2005 - 17:10 #1
Funtionen mysql_list_fields() er deprecated, hvilket betyder at man ikke bør anvende den mere.


===== ditFormScript.php =====

<?
$result = mysql_query("SHOW COLUMNS FROM dinTabel") or die(mysql_error());
if (mysql_num_rows($result) > 0)
{
?>
<form action="sitSaveScript.php" method="post">
<table>
<?
    while ($row = mysql_fetch_assoc($result))
    {
        $pos = strpos($row["Field"], "auto_increment");
        if ($pos === false)
        {
            echo "<tr>";
            echo "<td>" . $row["Field"] . "</td>";
            echo "<td><input type=\"text\" name=\"" . $row["Field"] . "\"></td>";
            echo "</tr>";
        }
    }
?>
</table>
<input type="submit">
</form>
<?
}
?>


===== ditSaveScript.php =====

<?
$result = mysql_query("SHOW COLUMNS FROM dinTabel") or die(mysql_error());
if (mysql_num_rows($result) > 0)
{
    $Fields = array();
    $Values = array();

    while ($row = mysql_fetch_assoc($result))
    {
        $Field = $row["Field"];
        if (isset($_POST[$Field]))
        {
            $Fields[] = $Field;

            $Value = "";

            $pos = strpos($row["Field"], "varchar");
            if ($pos !== false) $Value = "'";
            $Value .= $_POST[$Field];
            if ($pos !== false) $Value .= "'";

            $Values[] = $Value;
        }
    }

    $SQL = INSERT INTO dinTabel (" . implode(", ", $Fields) . ") VALUES (" . implode(", ", $Values) . ")";
    $mysql_query($SQL);
}
?>
Avatar billede hagler Nybegynder
16. august 2005 - 19:58 #2
ja okay , rigtigt og hvad så når jeg skal udskrive det..??? hvor de forskellige felter skal udskrives på forskellige måder..??? (((ps lige et under spørgsmål kan man lave flere database forespørgelser inden i hianden.? har nelig haft nogle problemmer med det.. med to while sætninger...)))
Avatar billede nielle Nybegynder
16. august 2005 - 20:18 #3
Jeg er ikke lige klar over hvad du mener med "udskrives på forskellige måder". Kan du ikke uddybe?
Avatar billede showsource Seniormester
16. august 2005 - 21:02 #4
"skal udskrives på en ftpside" ???
Hvad mener du?
Avatar billede hagler Nybegynder
17. august 2005 - 09:30 #5
udskrives på en php side. men hvor et f.eks date felter skal "udskrives" med en anden formatering end et f.eks text felt...
Avatar billede nielle Nybegynder
17. august 2005 - 09:36 #6
Kan du give et eksempel?
Avatar billede hagler Nybegynder
17. august 2005 - 10:43 #7
hmmm det er egentlig det jeg ikke kan... men jeg kan prøve at beskrive det lidt bedre tag fx din form, hvis man nu sagde at databasen var en ordre liste og den du har vil svare til at lave en ny ordre, men jeg skulle have at når jeg hade valgt en ordre at jeg vil få udskrevet værdierne i de "text bokse, dato felter" eller hvad det nu må være.

kort sagt jeg vil have at der bliver hentet værdier ind i formen som man skal kunne redigere og poste igen (også det blive opdateret i databasen)
Avatar billede nielle Nybegynder
17. august 2005 - 13:11 #8
Men tekst-felterne i en form kommer jo kun i to varianter input="text" og så textarea. Der er ikke noget specielt felt som lige egner sig til f.eks. tal eller datoer. Den eneste anden mulighed er en checkboks (til en boolean).
Avatar billede hagler Nybegynder
17. august 2005 - 15:07 #9
jep, men fisk... så siger vi bare at hvis felt typen er varchar skal den vises som <input type='text'>, int skal skjules og text/longtext skal vises som en textarea ;) ... meget smart... hvordan vil man kunne lave dette...???
Avatar billede nielle Nybegynder
17. august 2005 - 15:08 #10
Det kan sagtes laves men, hvorfor vil du have at int skal skjules?
Avatar billede hagler Nybegynder
17. august 2005 - 15:46 #11
ikke fedt der bliver vist id ;) ... men gider du komme med et eksemple..??? :)
Avatar billede nielle Nybegynder
17. august 2005 - 17:17 #12
Tænkte nok at det var noget i den stil som var forklaringen; If'et har jeg jo netop sorteret fra i det tidligere eksempel. Det ville være surt hvis man sorterede alle tal-felter fra, over en kam, bare for ikke at skulle vise id'et.

Jeg skal nok give et eksempel, men det kommer nok lige til at tage et stykke tid.
Avatar billede hagler Nybegynder
18. august 2005 - 08:32 #13
du må også gerne udskrive id'et det har ikke den store betydning... kan alligevel skjuld det på en anden måde ;) ...
Avatar billede nielle Nybegynder
18. august 2005 - 09:16 #14
Her er det første udkast til en form side som trækker data ud og præsentere dem for redigering. Den er endnu ikke så sofistikeret at den kender forskel på forskellige datatyper:

<?
$result = mysql_query("SHOW COLUMNS FROM dinTabel") or die(mysql_error());
if (mysql_num_rows($result) > 0)
{
    // Først finder vi field-navne.
    $fields = array();
    $keys = array();

    while ($row = mysql_fetch_assoc($result))
    {
        // Fields sorteres mellem om de er primary-keys/auto_increment eller "almindelige" felter.
        if (strpos($row["Key"], "PRI") === false && strpos($row["Field"], "auto_increment") === false)
        {
            $fields[] = $row["Field"];
        }
        else
        {
            $keys[] = $row["Field"];
        }
    }

    // Data opsættes i en tabel.
    echo "<table border='1'>";

    // Der sættes overskrifter på tabellen.
    echo "<tr>";
    foreach ($fields as $field)
    {
        echo "<th>" . $field . "</th>";
    }
    echo "<th>&nbsp;</td>";  // Ekstra kolonne til submit-buttons.
    echo "</tr>";

    // Data trækkes ud af database-tabellen.
    $result = mysql_query("SELECT * FROM dinTabel") or die(mysql_error());
    while ($row = mysql_fetch_assoc($result))
    {
        // En form pr. række i database-tabellen.
        echo "<form action='updateData.php' method='post'>";
        echo "<tr>";

        // Et input felt pr. field.
        foreach ($fields as $field)
        {
            echo "<td valign='top'>";
            echo "<input type='text' name='" . $field . "' value='" . $row[$field] . "'>";
            echo "</td>";
        }

        // Den sidste kolonne i tabellen.
        echo "<td valign='top'>";

        // Hver key indsættes som et hidden felt.
        foreach ($keys as $key)
        {
            echo "<input type='hidden' name='" . $key . "' value='" . $row[$key] . "'>";
        }

        // Og en submit-button.
        echo "<input type='sibmit'>";
        echo "</td>";

        echo "</tr>";
    }

    echo "</table>";
}
?>
Avatar billede hagler Nybegynder
19. august 2005 - 18:25 #15
ok... fair men det skal være stillet op på en anden måde... den skal stadig udskrive alle rækker... men det skal stilles op på på måden vist neden for.


id:            <skjult>
navn:          <fra databasen>
adresse:      <fra databasen>
by:            <fra databasen>


id:            <skjult>
navn:          <fra databasen>
adresse:      <fra databasen>
by:            <fra databasen>


id:            <skjult>
navn:          <fra databasen>
adresse:      <fra databasen>
by:            <fra databasen>
Avatar billede nielle Nybegynder
19. august 2005 - 19:50 #16
<?
$result = mysql_query("SHOW COLUMNS FROM dinTabel") or die(mysql_error());
if (mysql_num_rows($result) > 0)
{
    // Først finder vi field-navne.
    $fields = array();
    $keys = array();

    while ($row = mysql_fetch_assoc($result))
    {
        // Fields sorteres mellem om de er primary-keys/auto_increment eller "almindelige" felter.
        if (strpos($row["Key"], "PRI") === false && strpos($row["Field"], "auto_increment") === false)
        {
            $fields[] = $row["Field"];
        }
        else
        {
            $keys[] = $row["Field"];
        }
    }

    // Data trækkes ud af database-tabellen.
    $result = mysql_query("SELECT * FROM dinTabel") or die(mysql_error());
    while ($row = mysql_fetch_assoc($result))
    {
        // En form pr. række i database-tabellen.
        echo "<form action='updateData.php' method='post'>";

        // Hver key indsættes som et hidden felt.
        foreach ($keys as $key)
        {
            echo "<input type='hidden' name='" . $key . "' value='" . $row[$key] . "'>";
        }

        // Data opsættes i en tabel.
        echo "<table border='1'>";
       
        // En række i tabellen pr. field.
        foreach ($fields as $field)
        {
            echo "<tr>";
            echo "<td valign='top'>" . $field . "</td>";
            echo "<td><input type='text' name='" . $field . "' value='" . $row[$field] . "'><td>";
            echo "</tr>";
        }

        // Og en submit-button.       
        echo "<tr>";
        echo "<td colspan='2' align='center'><input type='submit'></td>";
        echo "</tr>";

        echo "</table>";

        echo "</form>";
    }
}
?>
Avatar billede hagler Nybegynder
23. august 2005 - 23:16 #17
Det er accepteret... resten kan jeg selv klare... Mange tak for hjælpen... send et svar og du vil få dine point... ;-)
Avatar billede nielle Nybegynder
24. august 2005 - 08:16 #18
Nåe, det var da ikke fordi at jeg ikke var parat til at gøre den færdig. Jeg ville bare sikre mig at det var den rette vej inden at jeg lavede en masse kode mere.

Dit ønske om at bruge et textarea for visse typer kan f.eks. implementeres ved at kigge på indholdet af feltet $row["Type"]. Du kan se hvilke felter der er findes, og hvad deres data er i den grå boks lige under Eksempel 1 på:

http://dk.php.net/mysql_list_fields


Der et i øvrigt en fejl i koden; Denne linje skal rettes:

if (strpos($row["Key"], "PRI") === false && strpos($row["Field"], "auto_increment") === false)

- til:

if (strpos($row["Key"], "PRI") === false && strpos($row["Extra"], "auto_increment") === false)
Avatar billede nielle Nybegynder
24. august 2005 - 08:16 #19
Og et svar :^)
Avatar billede hagler Nybegynder
24. august 2005 - 08:28 #20
lige et spørgsmål mere...
i dette område

echo "<td><input type='text' name='" . $field . "' value='" . $row[$field] . "'> OBS OBS OBS<td>";

der bliver variablen fields udskrevet med felt navnet, men jeg vil også gerne have udskrevet felt typen der... alså om det er ini varchar longtext etc.
Avatar billede nielle Nybegynder
24. august 2005 - 20:03 #21
Hvis du laver denne lille ændring til koden:

// Først finder vi field-navne.
$fields = array();
$keys = array();

$fieldTypes = array();

while ($row = mysql_fetch_assoc($result))
{
    // Fields sorteres mellem om de er primary-keys/auto_increment eller "almindelige" felter.
    if (strpos($row["Key"], "PRI") === false && strpos($row["Field"], "auto_increment") === false)
    {
        $field = $row["Field"];
        $fields[] = $field;
        $fieldType[$field] = $row["Type"];
    }
    else
    {
        $keys[] = $row["Field"];
    }
}

- så skulle du senere kunne finde typen af feltet $field som $fieldType[$field]:

echo "<tr>";
echo "<td valign='top'>" . $field . "&nbsp;(" . $fieldType[$field] . ")</td>";
echo "<td><input type='text' name='" . $field . "' value='" . $row[$field] . "'><td>";
echo "</tr>";
Avatar billede nielle Nybegynder
31. august 2005 - 17:50 #22
Har du fået kigget på det?
Avatar billede nielle Nybegynder
15. september 2005 - 18:34 #23
?
Avatar billede hagler Nybegynder
15. september 2006 - 08:10 #24
Luk spørgsmål
Avatar billede nielle Nybegynder
20. september 2006 - 21:41 #25
Nå?!
Avatar billede nielle Nybegynder
20. september 2006 - 21:42 #26
Du bad selv om et svar i 23/08-2005 23:16:17 - nogen speciel grund til at du nu afviser det?
Avatar billede hagler Nybegynder
22. september 2006 - 10:08 #27
fandt en bedre løsning selv... men mange tak for hjælpen alligevel
Avatar billede nielle Nybegynder
27. september 2006 - 20:26 #28
Det er da i orden, men så er det mindste du kan gøre at poste den her.

Desuden synes jeg ikke at det var specielt høfligt bare at lukke spørgsmålet på den pludselige måde uden en gang at give en forklaring eller et tak for hjælpen. Så vidt jeg kan se har jeg da brugt temmeligt meget tid på at hjælpe dig med denne her.
Avatar billede hagler Nybegynder
25. september 2007 - 22:16 #29
Hey nielle. Beklager, jeg har ikke været online i langtid og kan ikke huske grunden til dette... jeg vil gerne undskylde og gerne give dig dine Point samt sige stor tak for din fine indsats...
Avatar billede nielle Nybegynder
26. september 2007 - 19:00 #30
Jeg acceptere da din undskyldning, og der er egentligt også lige meget med point. :^)

Men du skriver at du har fundet en bedre løsning. Siden at du har det, så synes jeg da at du skal poste den her sådan ar den kan komme nogle flere til gavn.
Avatar billede hagler Nybegynder
15. oktober 2007 - 11:34 #31
Hey nielle. Jeg skulle bruge det til en kalender, hvor man kunne have forskellige kalender grupper og hver gruppe skulle have forskellige felter. fandt ud af det var nemere at oprette en hoved tabel til alle kalender emner og lave en join på de forskellige felter, alt af hængeligt af gruppen de var i.

Det kom til at se således ud som SQL, der hvor den henter de ekstre felter ud.
SELECT data, name FROM kalendere ke JOIN kalenderstruk ks ON ke.t_id = ks.id WHERE e_id = '$row[id]' ORDER BY position

Det virker, men kunne nok have været lavet på en anden måde  uden 30 SQL sætninger.
Men buhu det var mit første system i PHP, det virker og gør jobbet ;o)
Avatar billede nielle Nybegynder
16. oktober 2007 - 08:57 #32
30 SQL sætninger lyder af lidt i overkanten :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester