[PHP MYSQL] multi array koppeling

Pagina: 1
Acties:
  • 192 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een noob vraag waarschijnlijk alleen heb ik geen idee waar ik op moet zoeken om dit probleem op te lossen, de vraag is als volgt:

ik wil voor elk ingredient de ingredient_value_id koppelen aan de volgende foreach maar het enige wat er met onderstaande code gebeurd is dat hij bij de tweede foreach alleen de laatst gevonden waarde van de eerste foreacht geeft

hoe los ik dit op een goede manier op zodat de twee wel gekoppelde kunnen worden aan elkaar

alvast bedankt voor jullie hulp

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
if ($action)
{
    if (!$gerechtnaam)
        echo "<script>alert('niet alle verplichte velden zijn ingevuld')</script>";
    else
    {
        mysql_connect("localhost", "xxx", "xxx");
        mysql_select_db("xxx") or die(mysql_error());
    
        $query = "INSERT into kookboek SET gerechtnaam = '$gerechtnaam', categorie_id = '$categorie', land_id = '$land', bereidingswijze = '$bereidingswijze', opmerkingen = '$opmerkingen'";
        
        mysql_query($query);
        
        $last_id = mysql_insert_id();

        if (isset($_POST['ingredient'])) 
        { 
            foreach ($_POST['ingredient'] as $b =>$value)
                {
                    $ingredient_value_id = $value;
                }
        }
        if (isset($_POST['hoeveelheid'])) 
        { 
            foreach ($_POST['hoeveelheid'] as $a =>$value)
                {
                    $query2 = "INSERT into ingredienten_koppel SET id = '$last_id', id_ingredient = '$ingredient_value_id', hoeveelheid = '$value'";
                    
                    mysql_query($query2);
                }
        }
        mysql_close();
    }
}
?>

Acties:
  • 0 Henk 'm!

  • Stollie
  • Registratie: Juli 2007
  • Laatst online: 15:15
Je wilt dus zegmaar een nieuw ingredient toevoegen en die moet dan een unike id krijgen?

edit: moet nog effe beter kijken denk

[ Voor 18% gewijzigd door Stollie op 03-08-2007 15:06 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Als ik het goed begrijp heb je dus twee arrays: een POST van ingredienten en een POST van hoeveelheden. Dus je moet $hoeveelheid[0] van $ingredient[0] gebruiken en $hoeveelheid[2] van $ingredient[2]?

Wat je nu doet is in de eerste foreach namelijk elke keer de ingredient_value_id overschrijven ;) Wat je wilt is de arrays combineren, dus kijk eens naar wat array functies, bijv array_combine() :)
offtopic:
En je gebruikt nu het gerecht id als nieuw id in je koppeltabel. Heb je het zo ingesteld dat de combi (gerecht)id + ingredient_id uniek is? Als dat niet zo is zou ik sowieso je db tabel even veranderen: id (auto_increment), gerecht_id (verwijst naar id in gerechten tabel) & ingredient_id (verwijst naar id in ingredienten tabel)

[ Voor 25% gewijzigd door mithras op 03-08-2007 15:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nee, het ingredient bestaat al, maar heeft een id, deze is in een form gekozen, en heet in bovenstaande foreach loop uiteindelijk $ingredient_value_id, deze waarde wil ik dan doorgeven aan de 2e foreach loop.

in de 2e foreach loop gebruikt hij dus $last_id, dat is laatst toegevoegde record in de tabel kookboek, daarna zou dus $ingredient_value_id moeten komen (dit dus de waarde uit de eerste foreach, en dit zouden dus meerdere waarden kunnen zijn, daarom is dit dus een koppel tabel) en dan als laaste dus de hoeveelheid van het benodigde ingredient

ik hoop dat het zo duidelijk is wat de bedoeling is.

bedankt mithras dat is wat ik inderdaad wil doen 2 arrays koppelen :) alleen had geen idee hoe dat dus heet, was al opzoek geweest bij multi dymensional arrays e.d. maar dat was niet wat ik zocht :)

offtopic:
offtopic:
En je gebruikt nu het gerecht id als nieuw id in je koppeltabel. Heb je het zo ingesteld dat de combi (gerecht)id + ingredient_id uniek is? Als dat niet zo is zou ik sowieso je db tabel even veranderen: id (auto_increment), gerecht_id (verwijst naar id in gerechten tabel) & ingredient_id (verwijst naar id in ingredienten tabel)

als reactie hierop:

de tabel ingredienten heeft een uniek id, dus elk ingredient heeft z'n eigen id
en de kookboek tabel heeft ook een uniek id
deze twee worden dan dus gebruik in die ingredienten_koppel tabel in combinatie met de hoeveelheid van het product

[ Voor 42% gewijzigd door Verwijderd op 03-08-2007 15:12 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Let trouwens wel op dat je arrays van gelijke groote moet zijn. Je kan het ook handmatig doen, door een loopje te doen (for is hierin dan handig) waar je een tellertje mee laten lopen en elke keer waarde $i van ingredient en hoeveelheid in een nieuwe array stopt, welke je vervolgens met een foreach doorloopt om in de db te stoppen. Maar ik denk dat combine voor jou genoeg voldoet :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik de werking van combine snap in combinatie van wat ik wil dan zal het vast goed komen :)
En er is nu nog een probleem ik gebruik geen php 5
ik gebruik PHP Version 4.4.5-0.dotdeb.2

dus nu werkt die functie niet en krijg ik een error.

dus ik ga nu eens kijken naar een if loopje

[ Voor 51% gewijzigd door Verwijderd op 03-08-2007 15:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ben weer stukje verder
heb nu bijvoorbeeld als test
nu alleen nog i<4 vervangen door de array grootte dan ben ik er :) bedankt nogmaals mithras

ondertussen opgelost door count($ingredient)

PHP:
1
2
3
4
5
6
7
8
$ingredient = $_POST['ingredient'];
$hoeveelheid = $_POST['hoeveelheid'];
echo "<br>";
for ( $i = 0; $i<count($ingredient); $i++ )
{
    echo "$ingredient[$i] ";
    echo "$hoeveelheid[$i] ";
}

[ Voor 8% gewijzigd door Verwijderd op 03-08-2007 17:51 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik neem aan dat je ze net als array_combine als key=>value wilt koppelen (dus "suiker"=>"10gram"). Als je in je custom functie ook nog eens afvangt of de functie bestaat of niet (zo ja: gebruik die dan, omdat die waarschijnlijk sneller is dan een zelf gemaakte functie), krijg je zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * Combines two arrays like rray_combine
 * More information: http://php.net/array_combine
 * @param array $array1 will serve as key
 * @param array $array2 will serve as value for key
 * @return array
*/
function array_custom_combine($array1, $array2){
  if( function_exists('array_combine') ){
    $array = array_combine($array1, $array2);
  }else{
    $length = count($array1);
    for($i=0; $i<$length; $i++){
      $array[ $array1[$i] ] = $array2[$i];
    }
  }
  return $array
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb hem nu op volgende manier gebruikt en hij doet nu wat ik hem wilde laten doen

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php

if ($action)
{
    if (!$gerechtnaam)
        echo "<script>alert('niet alle verplichte velden zijn ingevuld')</script>";
    else
    {
        mysql_connect("localhost", "xxx", "xxx");
        mysql_select_db("xxx") or die(mysql_error());
    
        $query = "INSERT into kookboek SET gerechtnaam = '$gerechtnaam', categorie_id = '$categorie', land_id = '$land', bereidingswijze = '$bereidingswijze', opmerkingen = '$opmerkingen'";
        
        mysql_query($query);
        
        $last_id = mysql_insert_id();

        $ingredient = $_POST['ingredient'];
        $hoeveelheid = $_POST['hoeveelheid'];
        echo "<br>";
        for ( $i = 1; $i<count($ingredient)+1; $i++ )
            {
//              echo "$ingredient[$i] "; 
//              echo "$hoeveelheid[$i] ";
                $query2 = "INSERT into ingredienten_koppel SET id = '$last_id', id_ingredient = '$ingredient[$i]', hoeveelheid = '$hoeveelheid[$i]'"; 
                mysql_query($query2);
            }
        mysql_close(); 
    }
}
?>

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Als advies geef ik je wel mee dat je beter je count uit je for kan halen. Als je array 100 elementen bevat ga je het wel degelijk merken dat er 100 keer een array-grootte berekend wordt, in plaatst van maar één keer ;)

Ook is de "tot $i<count+1" onlogisch, want je array begint toch met een key 0, en niet 1? Dus zou je hem moeten laten lopen vanaf $i=1. En laat hem anders lopen "tot $i<=count", in plaats van die +1 :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat advies van die count is wel handig, dat pas ik nog aan inderdaad, dat scheelt inderdaad, mocht ik ooit zo'n groot recept krijgen :)

de array begint bij 1 vandaar +1, 0 is namelijk ook nog een keuze maar die mag niet in de insert komen vandaar deze oplossing, had nog niet gedacht aan <= dat kan natuurlijk ook, dus die pas ik ook aan, heel erg bedankt voor je hulp.

mocht je het complete script willen zien, wil ik die ook wel even posten
Pagina: 1