[PHP] variabelen combineren

Pagina: 1
Acties:
  • 2.736 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
Ik ben druk bezig met mijn eerste stappen in de SQL/PHP wereld. Nu stapte ik even buiten de normale lesstof en probeerde op een korte manier een aantal genres uit een form te halen en die in een query te stoppen.

Het gaat alleen al fout bij het stoppen van de genres in een aparte variabele. Hier het stukje relevante code:

PHP:
1
2
3
4
5
6
7
8
$y=0;
for ($i = 1; $i <= 25; $i += 1){ 
if (isset($_POST['Genre'.$i]) == 1){
$y+=1; 
$genre.$y = $_POST['Genre'.$i]; 
print($genre.$y);}} 

for ($q = 1; $q <= $y; $q++){ print($genre . $q); }


Die 2e print staat er om te testen of ik de genres (aantal kan tussen 1 en 5 liggen, maar ik houd het gewoon rekbaar) op de juiste manier opsla en terug kan vinden. Er zijn 25 verschillende genres.

De eerste print geeft netjes: "AdventureAnimationComedyFamilyFantasy"
De tweede geeft niks en later gaat het bij de query die die genres opslaat ook fout en "died" het script met foutmelding.

Ik heb natuurlijk al een beetje rondgezocht. Leraar had geen idee, die heeft informatica eigenlijk alleen als hobby. Hij heeft technische wiskunde gestudeerd en geeft natuurkunde en inf ;)

Google'en op "combine variables" gaf me niet meer dan die punten tussen de variabelen.

Kan iemand mij aangeven wat ik fout doe?

Het kan vast sneller/makkelijker en beter, maar ik moet het natuurlijk nog wel kunnen uitleggen, anders snapt de leraar er ook niks meer van. Nogmaals, dit is dus geen verkapte huiswerk vraag, ik kan het op de "domme" manier ook wel werkend krijgen, dit is gewoon een stukje buiten de lesstof dat het vak juist leuk maakt. :)

Acties:
  • 0 Henk 'm!

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Verdiep je eerst nog eens in arrays.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Acties:
  • 0 Henk 'm!

  • kaesve
  • Registratie: Maart 2009
  • Laatst online: 16-05 03:04
dit vind ik toch wel een van de meest obscure dingen die php toelaat: variabele variabelen.. sowieso zou ik het dus anders oplossen.
ook vind ik het zelf netter om isset() niet te vergelijken, en zeker niet met een integer. isset returned gewoon een bool-variabele, en kan dus direct door de if-statement worden gebruikt.

zou je niet even kunnen proberen om ze expliciet aan te roepen, gewoon om te kijken wat er gebeurt? dus na je for-lusje even echo $genre1 doen?

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Waarom werk je niet met arrays? en foreach loops ipv for?
$y+=1 kan je ook vervangen door $y++ (of $y-- voor aftellen).
Sowieso kan een POST variabele ook een array bevatten ;)
Doe je door:
HTML:
1
2
3
4
5
<select>
 <option type="checkbox" name="Genre[]" value="x">Genre X</option>
 <option type="checkbox" name="Genre[]" value="y">Genre Y</option>
 <option type="checkbox" name="Genre[]" value="z">Genre Z</option>
</select>

Note de "[]" achter de name. Dat indiceert dat de betreffede POST variabele een array is en dus meerdere waarden op rij kan bevatten.
Zie het als een ladekastje dat Genre heet en een variabel aantal lades heeft waar je dan weer genrenamen in stopt.


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$y=0;

#elke lade in het lade kastje langslopen en de inhoud in de array $genre stoppen, met genummerde lades middels $y
foreach($_POST['Genre'] as $key1 => $var1) {
 $y++; 
 $genre[$y] = $var1; 
 print($genre[$y]);
}

#postvar inhoud tonen met nette html linebreaks
echo nl2br(print_r($_POST['Genre'], true)); 

#dan inhoud van de $genre var tonen met nette html linebreaks
echo nl2br(print_r($genre, true));
?>


Editje:
HTML verbeterd, comments in de PHP code.

Jouw methode lijkt me trouwens extreem kut om bij te houden. Ik zie niet hoe je dat in de rest van je code overzichtelijk oproept e.d.
Arrays zijn echt the way to go.

[ Voor 40% gewijzigd door McKaamos op 09-03-2010 21:05 ]

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 00:29
$genre.$y is de (string)concatenatie van $genre en $y, geen variabele variabele. Maar inderdaad gewoon met arrays aan de slag gaan.

Denk ook aan inspringing om de code een beetje overzichtelijk te houden.
McKaamos schreef op dinsdag 09 maart 2010 @ 20:55:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
$y=0;
foreach($_POST['Genre'] as $key1 => $var1) {
 $y++; 
 $genre[$y] = $var1; 
 print($genre[$y]);
}
 
print_r($genre);
?>
Die hele $y (en $key1) kun je weglaten en behalve het printen doet
PHP:
1
$genre = $_POST['Genre'];
hetzelfde (mits dat formulier zo gebruikt wordt en niet met namen als "Genre[test]").

[ Voor 53% gewijzigd door Raynman op 09-03-2010 21:04 ]


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
kaesve schreef op dinsdag 09 maart 2010 @ 20:50:
ook vind ik het zelf netter om isset() niet te vergelijken, en zeker niet met een integer. isset returned gewoon een bool-variabele, en kan dus direct door de if-statement worden gebruikt.
Dus ik hoef niet == 1?, kan meteen de opdracht erachter? Pas ik dat even aan :)
zou je niet even kunnen proberen om ze expliciet aan te roepen, gewoon om te kijken wat er gebeurt? dus na je for-lusje even echo $genre1 doen?
Werkt niet...

Tijd voor arrays dan maar, hoopte dat te kunnen vermijden. Als ik een beetje zie wat het doet, is het een veel beter oplossing voor mijn probleem.

Zal ook meteen even naar foreach kijken, dat heb ik nog nooit gezien.

McKaamos, bedankt voor de uitgebreide uitleg :) en raynman voor de tips.

[ Voor 4% gewijzigd door Vanx op 09-03-2010 21:06 ]


Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Vanx schreef op dinsdag 09 maart 2010 @ 21:03:
[...]


Dus ik hoef niet == 1?, kan meteen de opdracht erachter? Pas ik dat even aan :)


[...]

Werkt niet...

Tijd voor arrays dan maar, hoopte dat te kunnen vermijden. Als ik een beetje zie wat het doet, is het een veel beter oplossing voor mijn probleem.

Zal ook meteen even naar foreach kijken, dat heb ik nog nooit gezien.

McKaamos, bedankt voor de uitgebreide uitleg :) en raynman voor de tips.
Arrays vermijden? Waarom? Omdat je er zelf nog niet thuis in bent?
Echt, het maakt je code 10x overzichtelijker, er zijn veel betere constructies met arrays te maken.

Graag gedaan iig ;)
En ja, foreach, een geweldig handige for constructie die een opgegeven array langsloopt, uitleest en bij elke lade de naam van de lade (indien benoemd, anders nummertje) en de inhoud in twee makkelijk bruikbare varaibelen stopt ;)

PHP kent zo veel mooie, handige opties om arrays te manipuleren :) array_sort, array_push, etc :)
Raynman schreef op dinsdag 09 maart 2010 @ 20:58:
$genre.$y is de (string)concatenatie van $genre en $y, geen variabele variabele. Maar inderdaad gewoon met arrays aan de slag gaan.

Denk ook aan inspringing om de code een beetje overzichtelijk te houden.

[...]

Die hele $y (en $key1) kun je weglaten en behalve het printen doet
PHP:
1
$genre = $_POST['Genre'];
hetzelfde (mits dat formulier zo gebruikt wordt en niet met namen als "Genre[test]").
Klopt, bijna de hele code kan achterwege gelaten worden.
Was puur ter illustratie. Uiteraard is deze code zo ongeveer zinloos, maar stel dattie iets anders wil doen binnen de foreach loop. Dan is foreach ook meteen geillustreerd ;)

[ Voor 52% gewijzigd door McKaamos op 09-03-2010 21:14 ]

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • DEiE
  • Registratie: November 2006
  • Laatst online: 16-08 19:21
Om het volledig te maken, hier het artikel over arrays van de php-site: http://php.net/manual/en/language.types.array.php
Ook van de php-site, de beschikbare arrayfuncties: http://www.php.net/manual/en/ref.array.php

[ Voor 28% gewijzigd door DEiE op 09-03-2010 21:10 ]


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
McKaamos schreef op dinsdag 09 maart 2010 @ 21:06:
[...]


Arrays vermijden? Waarom? Omdat je er zelf nog niet thuis in bent?
Echt, het maakt je code 10x overzichtelijker, er zijn veel betere constructies met arrays te maken.

Graag gedaan iig ;)
En ja, foreach, een geweldig handige for constructie die een opgegeven array langsloopt, uitleest en bij elke lade de naam van de lade (indien benoemd, anders nummertje) en de inhoud in twee makkelijk bruikbare varaibelen stopt ;)

PHP kent zo veel mooie, handige opties om arrays te manipuleren :) array_sort, array_push, etc :)
Ik krijg een cijfer voor mijn SQL kwaliteiten, al het "mooie" PHP is extra. Wel leuk natuurlijk, maar mijn wiskunde toets van vrijdag is ook leuk ;)
Raynman schreef op dinsdag 09 maart 2010 @ 20:58:

Die hele $y (en $key1) kun je weglaten en behalve het printen doet
PHP:
1
$genre = $_POST['Genre'];
hetzelfde (mits dat formulier zo gebruikt wordt en niet met namen als "Genre[test]").
Zou je iets meer kunnen vertellen? Hoe zou de foreach dan worden?

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Vanx schreef op dinsdag 09 maart 2010 @ 21:12:
[...]


Ik krijg een cijfer voor mijn SQL kwaliteiten, al het "mooie" PHP is extra. Wel leuk natuurlijk, maar mijn wiskunde toets van vrijdag is ook leuk ;)


[...]


Zou je iets meer kunnen vertellen? Hoe zou de foreach dan worden?
Haha, die mag de deur uit ;)
$_POST['Genre'] is al een genummerde array en kan je rechtstreeks overpompen middels een = teken ;)
Mijn idee was om jouw code even een slag te versimpelen, voor het overzicht zeg maar.

Trouwens, als je met SQL iets uit de database trekt en verwerkt met PHP heb je netzogoed arrays nodig ;)

voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$query = "SELECT * FROM `users` WHERE `clue` > 0;"; #*grinnik*
$result = mysql_query($query);

echo "<table>
<tr>
 <th>Voornaam</th>
 <th>Achternaam</th>
</tr>";

foreach($row = mysql_fetch_assoc($result)) {
 echo "<tr>
 <td>".$row['firstname']."</td>
 <td>".$row['lastname']."</td>
</tr>"
}

echo "</table>";


In dit voorbeeld is $row een array variabele waarin lades zitten met de namen van de tabel kolommen.
Elke keer dattie een stapje verder gaat is $row gevuld met de volgende regel van de tabel, zodat je dus nieuwe gegevens echo'd tot je het einde van het resultaat van de query hebt bereikt. ;)

Oh, en als je mysql_fetch_array doet ipv mysql_fetch_assoc krijg je een genummerde array, met de kolommen genummerd van 0 tot x, afhankelijk van het aantal kolommen.
Benoemd (associative, aka assoc) geeft elke lade van de array de naam van de kolom, wat het overzichtelijker maakt.

edit:
Oh, en zie je ook wat dit doet?
PHP:
1
<?for($i=1;$i<11;$i++){for($j=1;$j<11;$j++){echo $i."x".$j."=".$i*$j}}?>

Code minimalisatie ;) Het schijnt een sport/kunst te zijn ;)
Maybe leuke brainteaser voor je docent :P

[ Voor 18% gewijzigd door McKaamos op 09-03-2010 21:42 ]

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
McKaamos schreef op dinsdag 09 maart 2010 @ 21:20:

edit:
Oh, en zie je ook wat dit doet?
PHP:
1
<?for($i=1;$i<11;$i++){for($j=1;$j<11;$j++){echo $i."x".$j."=".$i*$j}}?>

Code minimalisatie ;) Het schijnt een sport/kunst te zijn ;)
Maybe leuke brainteaser voor je docent :P
Even kijken:

als i =1 dan laat je dus de tafel (vermenigvuldigen met getallen elke keer 1 omhoog tot 10) van 1 zien
als i = 2 dan laat je tafel van 2 zien.

Ik vrees wel dat het een klerechaos word zonder linebreaks :P

PHP:
1
<?for($i=1;$i<11;$i++){for($j=1;$j<11;$j++){echo $i."x".$j."=".$i*$j "/n";} echo "/n";}?>


Zo geeft toch netjes elke tafel op een nieuwe regel en een regel overslaan bij een nieuwe tafel? Ik heb niet gespiekt door gewoon het php bestandje op mijn USB server te zetten :P

Code optimaliseren vind ik altijd wel erg leuk, ik ben meer wiskundige dan informaticus.

Ik zat nog even te kloten met foreach, blijkt lastiger te zijn dan gedacht :X

Ik krijg een syntax error: Warning: Invalid argument supplied for foreach() in W:\www\Films.php on line 18

Ik heb netjes in mijn form alle genres aangepast (dit zijn er dus 4 van de 25):
HTML:
1
2
3
4
<input type="checkbox" name="Genre[]" value="Action">Action </td><td>
<input type="checkbox" name="Genre[]" value="Adventure">Adventure </td><td>
<input type="checkbox" name="Genre[]" value="Animation">Animation </td><td>
<input type="checkbox" name="Genre[]" value="Biography">Biography </td><td>


Als ik de genres nummer in de [] geeft dat ook errors.

PHP:
1
2
3
4
5
foreach($_POST['Genre'] as $key1 => $var1) {
 $y++; 
 $genre[$y] = $var1; 
 print($genre[$y]);
}


Wat ik hiervan snap, is dat alle genres worden opgehaald en dat ze worden opgeslagen op de plekjes in de array genre (associatieve array, volgens mijn informatica methode O-) ). Ik snap niet waarom er $key1=>$var1 wordt gedaan.

Jij dacht dat ik een dropdown menu gebruik, maar ik gebruik dus checkboxes. Zorgt dat voor een belangrijk verschil?

[ Voor 9% gewijzigd door Vanx op 09-03-2010 22:12 ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 17:22
Foreach geeft alleen een warning indien wat je hem aanlevert geen Array is maar een string/int/boolean. Of terwijl, alles behalve een array. Foreach werkt voor de rest heel simpel:

Stel je hebt een array van 10 chars:
PHP:
1
2
3
4
5
6
7
8
$a = array(1,2,3,4,5,6,7,8,9,10);
$d = array();
/*
  foreach($a as $b => $c) { $b = array index; $c = array antwoord;  }
  Kort door de bocht:
  $b = 0,1,2,3,4,5,6,7,8,9
  $c = 1,2,3,4,5,6,7,8,9,10
*/


Verder doe eens een print_r op $_POST["Genre"];
PHP:
1
print_r($_POST["Genre"]);

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Vanx schreef op dinsdag 09 maart 2010 @ 22:08:
[...]


Even kijken:

als i =1 dan laat je dus de tafel (vermenigvuldigen met getallen elke keer 1 omhoog tot 10) van 1 zien
als i = 2 dan laat je tafel van 2 zien.

Ik vrees wel dat het een klerechaos word zonder linebreaks :P

PHP:
1
<?for($i=1;$i<11;$i++){for($j=1;$j<11;$j++){echo $i."x".$j."=".$i*$j "/n";} echo "/n";}?>


Zo geeft toch netjes elke tafel op een nieuwe regel en een regel overslaan bij een nieuwe tafel? Ik heb niet gespiekt door gewoon het php bestandje op mijn USB server te zetten :P
Tafels van 1 t/m 10 idd, zonder enige formatting ;) en de slash voor de "n" moet een backslash zijn als je er een newline van wil maken.
In HTML doet dat alleen niet zoveel, gezien HTML alleen reageert op breaks in de vorm van <br/> ;)
Output is idd een klerebende zonder formatting ;)
Oh, en vergeet de punt niet tussen non-text en text delen van de echo ;)
Ik zat nog even te kloten met foreach, blijkt lastiger te zijn dan gedacht :X

Ik krijg een syntax error: Warning: Invalid argument supplied for foreach() in W:\www\Films.php on line 18

Ik heb netjes in mijn form alle genres aangepast (dit zijn er dus 4 van de 25):
HTML:
1
2
3
4
<input type="checkbox" name="Genre[]" value="Action">Action </td><td>
<input type="checkbox" name="Genre[]" value="Adventure">Adventure </td><td>
<input type="checkbox" name="Genre[]" value="Animation">Animation </td><td>
<input type="checkbox" name="Genre[]" value="Biography">Biography </td><td>


Als ik de genres nummer in de [] geeft dat ook erros.
Niks tussen de blokhaken zetten. Dat doet iets, maar geen idee wat. Iig moet het dan anders opgeroepen worden in PHP. Gebruik zelf nooit tekst tussen de blokhaken. Ik maak gewoon een nieuwe naam voor de volgende groep.
Mocht je Form een name attribuut hebben, dan wordt het $_POST['formname']['Genre'] (multidimensionale array)
PHP:
1
2
3
4
5
foreach($_POST['Genre'] as $key1 => $var1) {
 $y++; 
 $genre[$y] = $var1; 
 print($genre[$y]);
}


Wat ik hiervan snap, is dat alle genres worden opgehaald en dat ze worden opgeslagen op de plekjes in de array genre (assosciatieve array, volgens mijn informatica methode O-) ). Ik snap niet waarom er $key1=>$var1 wordt gedaan.

Jij dacht dat ik een dropdown menu gebruik, maar ik gebruik dus checkboxes. Zorgt dat voor een belangrijk verschil?
Dropdown, checkbox, maakt niet zoveel uit, als je maar meerdere waarden kan selecteren en alle mogelijkheden maar "Genre[]" als name attribuut hebben.

$key doet niks anders dan de naam of het nummer van de lade bevatten, $var bevat de waarde van de lade.
Elke keer dat foreach een nieuwe omwenteling maakt gaat hij een stapje verder in de array, en dan wordt de inhoud van dat stapje dus in $key en $var gestopt.
Zo kan je zonder variabele namen te hoeven veranderen je acties loopen. Anders zou je, zoals je eerder deed, allerlei rare samengestelde namen moeten gaan maken, extra tellertjes erbij, etc.

Waarom je een error krijgt volg ik niet direct eigenlijk.
Print_r de $_POST variabele eens en post de output eens? Kunnen we ff kijken wat er precies in zit, en desgewenst code aanpassen.

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
McKaamos schreef op dinsdag 09 maart 2010 @ 22:19:

$key doet niks anders dan de naam of het nummer van de lade bevatten, $var bevat de waarde van de lade.
Elke keer dat foreach een nieuwe omwenteling maakt gaat hij een stapje verder in de array, en dan wordt de inhoud van dat stapje dus in $key en $var gestopt.
Waarom gebruik je dan de $y om het nummer aan te geven het genretype? Daar is die $var toch voor?

Krijg ik op deze manier wel een helemaal gevulde array? En niet eentje met allemaal gaten doordat die checkbox niet aangevinkt is?

Ik ga morgen even mijn code verder ombouwen en kijken wat er gebeurt. Nu verpest ik het alleen maar, gala afgelopen nacht is niet goed voor concentratie :Y)

In ieder geval top dat je zoveel moeite doet voor mij _/-\o_ Zo leer ik meer dan in een halfjaar informatica.
Manuel schreef op dinsdag 09 maart 2010 @ 22:15:
Foreach geeft alleen een warning indien wat je hem aanlevert geen Array is maar een string/int/boolean. Of terwijl, alles behalve een array. Foreach werkt voor de rest heel simpel:

<knip code>

Verder doe eens een print_r op $_POST["Genre"];
PHP:
1
print_r($_POST["Genre"]);
Dat ga ik nog even proberen :) De foreach snap ik nu helemaal met jouw korte uitleg :) , zat alleen even met de $y en de $key1 uit het voorbeeld van Mckaamos.

[ Voor 24% gewijzigd door Vanx op 09-03-2010 22:30 ]


Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Vanx schreef op dinsdag 09 maart 2010 @ 22:25:
[...]


Waarom gebruik je dan de $y om het nummer aan te geven het genretype? Daar is die $var toch voor?

Krijg ik op deze manier wel een helemaal gevulde array? En niet eentje met allemaal gaten doordat die checkbox niet aangevinkt is?

Ik ga morgen even mijn code verder ombouwen en kijken wat er gebeurt. Nu verpest ik het alleen maar, gala afgelopen nacht is niet goed voor concentratie :Y)

In ieder geval top dat je zoveel moeite doet voor mij _/-\o_ Zo leer ik meer dan in een halfjaar informatica.
$y zou vervangen kunnen worden door $key. Dat is nl het nummer van de lade.
Zoals ik al zei, even een hele snelle versimpeling. Had nog makkelijker gekund, en in princiepe kon de hele loop overboord ;)
Was meer om je even kennis te laten maken met foreach en arrays ;)

Als ik het zo uit m'n hoofd goed zeg, is het wel zo dat je browser alle items in de lijst telt en dan alleen de waarden doorstuurt waar jij een vinkje zet, dus de $key kan nog wel eens verspringen.

Dus dan kan $_POST['Genre'] ook dit bevatten:
[5] => "action"
[21] => "comedy"
[34] => "vanx"

Daarom had ik de $y er wel bij gezet.
Omdat foreach elk item afloopt, en gewoon van de ene naar de volgende gevulde waarde springt, krijg je met $y een netjes oplopende serie, zonder gaten in de nummering.

Als je foreach gebruikt is het niet eens echt nodig om $y te gebruiken, maar stel dat je toch ergens weer raar wil gaan doen met oplopende nummertjes, dan is het wel handig ;)

Ennuh, geen punt hoor ;)
Ik vind het zelf ook altijd leuk om met PHP te hobbieen ;) Vinden ze @ work ook erg leuk, nu ik wat mooie dingetjes in elkaar geknutseld heb :P

[ Voor 5% gewijzigd door McKaamos op 09-03-2010 22:39 ]

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 00:29
Vanx schreef op dinsdag 09 maart 2010 @ 22:08:
[...]
Code optimaliseren vind ik altijd wel erg leuk, ik ben meer wiskundige dan informaticus.
Dat zou ik geen optimaliseren noemen. Er is alleen minder witruimte die een parser/lexer moet weggooien, maar dat zul je niet merken. Overigens kunnen de accolades ook nog weggelaten worden (in het eerste geval met enkele echo).
Ik krijg een syntax error: Warning: Invalid argument supplied for foreach() in W:\www\Films.php on line 18
Het is een 'warning', geen 'syntax error', en er staat ook een aanwijzing in zoals reeds aangegeven. Goed de foutmelding lezen geeft je meestal al aardig een idee van het probleem.
Ik snap niet waarom er $key1=>$var1 wordt gedaan.
Die $key1 wordt inderdaad niet gebruikt, maar verder is het denk ik gewoon een kwestie van voor jou onbekende syntax, dus check de manual (of het is de genoemde brakheid ;) ).
McKaamos schreef op dinsdag 09 maart 2010 @ 22:19:
[...]

Niks tussen de blokhaken zetten. Dat doet iets, maar geen idee wat. Iig moet het dan anders opgeroepen worden in PHP. Gebruik zelf nooit tekst tussen de blokhaken. Ik maak gewoon een nieuwe naam voor de volgende groep.
en
Als ik het zo uit m'n hoofd goed zeg, is het wel zo dat je browser alle items in de lijst telt en dan alleen de waarden doorstuurt waar jij een vinkje zet, dus de $key kan nog wel eens verspringen.
(Ook uit mijn hoofd) De browser stuurt gewoon voor elk aangevinkte/geselecteerde element Genre[]=waarde. In PHP wordt dat een array genummerd vanaf 0. Als je Genre[3] of Genre[test] als name voor je formulierveld gebruikt, kun je dat terugvinden in $_POST['Genre']['test'].
Dus dan kan $_POST['Genre'] ook dit bevatten:
\[5] => "action"
\[21] => "comedy"
\[34] => "vanx"

Daarom had ik de $y er wel bij gezet.
Omdat foreach elk item afloopt, en gewoon van de ene naar de volgende gevulde waarde springt, krijg je met $y een netjes oplopende serie, zonder gaten in de nummering.
Dat probleem is er dus niet, maar anders kun je ook weer $genre[] (leeg haakjespaar) gebruiken, dus die $y blijft overbodig :P

Edit: maar dit is ook allemaal uit te vogelen door print_r($_POST) en het posten van wat verschillende formulieren.
Mocht je Form een name attribuut hebben, dan wordt het $_POST['formname']['Genre'] (multidimensionale array)
:?

[ Voor 3% gewijzigd door Raynman op 09-03-2010 22:51 ]


Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Raynman schreef op dinsdag 09 maart 2010 @ 22:44:
[...]

Dat zou ik geen optimaliseren noemen. Er is alleen minder witruimte die een parser/lexer moet weggooien, maar dat zul je niet merken. Overigens kunnen de accolades ook nog weggelaten worden (in het eerste geval met enkele echo).
Optimaliseren is het idd niet. Het is minimaliseren ;)
Kweet het verhaal er niet achter, maar er is ook een mafkees geweest die een heel stuk Perl code in de vorm van een kameel had geperst, a-la ASCII Art :P Werkte schijnbaar ook nog.

En wil je echt een hersenkraker hebben, probeer dan eens iets te programmeren in Brainfuck :P
[...]

Het is een 'warning', geen 'syntax error', en er staat ook een aanwijzing in zoals reeds aangegeven. Goed de foutmelding lezen geeft je meestal al aardig een idee van het probleem.

[...]

Die $key1 wordt inderdaad niet gebruikt, maar verder is het denk ik gewoon een kwestie van voor jou onbekende syntax, dus check de manual (of het is de genoemde brakheid ;) ).


[...]
en
[...]
(Ook uit mijn hoofd) De browser stuurt gewoon voor elk aangevinkte/geselecteerde element Genre[]=waarde. In PHP wordt dat een array genummerd vanaf 0. Als je Genre\[3] of Genre[test] als name voor je formulierveld gebruikt, kun je dat terugvinden in $_POST['Genre']['test'].

[...]
Dat probleem is er dus niet, maar anders kun je ook weer $genre[] (leeg haakjespaar) gebruiken, dus die $y blijft overbodig :P

Edit: maar dit is ook allemaal uit te vogelen door print_r($_POST) en het posten van wat verschillende formulieren.
Ach jah, kan ook wel eens kloppen iig ;) punt blijft dat de hele loop gewoon overboord kan, met alles wat erbij hoort ;)
[...]

:?
$_POST is uberhaupt al een array, stop je er meer arrays in, dan heet het een multidimensionele array ;)
Als je <form> element een name attribuut heeft komt er eerst een set blokhaken met de formnaam en dan pas de blokhaken met andere variabelen en arrays. Dan issie dus multidimensioneel ;)
Op die manier kan je, iig in theorie, ook meerdere forms posten. Geloof niet dat dat lukt met 1 submitknopje, maar toch :P

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
Nou, de genre is gewoon gelukt. Net even wat dingetjes verbeterd en ineens was het weg. Ik krijg nu een mooie gevulde array. Die print_r is ook handig om te zien of het form goed "doorkomt".


Ik kan gewoon de andere gegevens in de database proppen en ook netjes terugvinden met phpmyadmin, maar hij maakt maar 1 rij bij het genre.

Dit doet alleen niet wat het moet doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
for( $i = 1; $i <= count($genre); $i++){ 
mysql_query("INSERT INTO `genre` (
`Titel` ,
`Genre` 
)
VALUES (
'$titel', '$genre[$i]'
)") or die (mysql_error());

echo "<br> genre";
}


Ik wil gewoon 5 nieuwe rijen invoeren, uit het genre.

Besef me net dat foreach hier ook gebruikt kan worden, naja dit hoort het te doen. Jullie een idee wat het is? :P

[ Voor 10% gewijzigd door Vanx op 10-03-2010 17:48 ]


Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Ik zie het al, de semicolon mist aan het einde van de query ;)

PHP:
1
2
3
4
5
6
7
mysql_query("INSERT INTO `genre` (
`Titel` ,
`Genre` 
)
VALUES (
'$titel', '$genre[$i]'
);")


Andere oplossing, met foreach:
PHP:
1
2
3
4
5
6
7
foreach($genre as $key => $val) { 
mysql_query("INSERT INTO `genre` (`Titel` ,`Genre` )
VALUES ('$titel', '$val');")
or die (mysql_error());

echo "<br> genre";
}


Dat geeft alleen wel een hele hoop queries op een rij. Het kan ook met één query ;)

PHP:
1
2
3
4
5
6
7
8
9
10
$query = "INSERT INTO `genre` (`Titel` ,`Genre` ) VALUES "; #lege query

foreach ($genre as $key => $val) {
 if ($key > 0) {$query .= ","} #na eerste valueset een comma toevoegen na elke toegevoegde valueset
 $query .= "('$titel', '$val')"; #nieuwe valueset invoegen
 echo "<br> genre";
}
$query .= ";"; #semicolon op het einde, et voila

mysql_query($query) or die (mysql_error()); #alles in 1 keer de database in pompen

Iets meer code, minder druk op de database ;)

[ Voor 70% gewijzigd door McKaamos op 10-03-2010 17:57 ]

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
ah, puntkomma's toegevoegd :) .

"Duplicate entry 'Toy Story' for key 1"

Dat is nog steeds de error. Dus ik dacht dat dan is vast de titel in die tabel uniek, en kan een film maar 1 genre bevatten. Volgens phpmyadmin is titel gewoon de primary key, dus zouden er meerdere per kolom in kunnen zitten.

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Vanx schreef op woensdag 10 maart 2010 @ 17:57:
ah, puntkomma's toegevoegd :) .

"Duplicate entry 'Toy Story' for key 1"

Dat is nog steeds de error. Dus ik dacht dat dan is vast de titel in die tabel uniek, en kan een film maar 1 genre bevatten. Volgens phpmyadmin is titel gewoon de primary key, dus zouden er meerdere per kolom in kunnen zitten.
Primary Key alleen is niet genoeg. Als je zonder de key te noemen wil toevoegen moet er ook auto_increment op de key kolom staan ;)

Titel moet je sowieso niet als primary key gebruiken trouwens ;) Daar moet je eigenlijk een ID nummer voor nemen. Apparte kolom daar voor toevoegen die je b.v. film_id noemt, setten als INT of BIGINT (afhankelijk van hoeveel je denkt dat er in de DB moet) primary key en auto_increment ;)

Primary Key moet ook uniek zijn trouwens, anders kan hij daar niet op indexen. Twee keer dezelfde tekst als key kan dus niet ;)

Edit: Ik weet niet wat je precies moet doen met de data trouwens, maar even uitgaande van een voorbeeld als movie webshop zou je eigenlijk meerdere tabellen moeten gaan maken.

-Filmnamen, om elke film een ID nummer te geven en eventueel extra info over de film op te slaan.
-Genrenamen, elk genre een ID nummer
-Voorraad, hoeveel stuks van film-id X er is en wat die kost.
-Koppelingstabel tussen films en welke ID nummers daarbij horen, a-la de tabel die je nu maakt.

Een aantal kleine tabellen dus, met losse delen informatie zodat je zoveel mogelijk dubbele inhoud tegengaat en je b.v. de film naam maar op 1 plek hoeft aan te passen, en niet 20 keer omdat de film onder 20 genres valt ;)

Stukje database normalisatie, zoals dat heet.

[ Voor 55% gewijzigd door McKaamos op 10-03-2010 18:08 ]

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
Ik weet dat een los id nummer beter is, maar ik stop in de database alleen maar films die ik zelf, eh, geript heb O-)

Ik heb ook geen remakes ofzo, dus ik dacht dat het zo ook wel kon.

Ik heb auto-increment gevonden, nu weer even prutsen.

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Vanx schreef op woensdag 10 maart 2010 @ 18:04:
Ik weet dat een los id nummer beter is, maar ik stop in de database alleen maar films die ik zelf, eh, geript heb O-)

Ik heb ook geen remakes ofzo, dus ik dacht dat het zo ook wel kon.

Ik heb auto-increment gevonden, nu weer even prutsen.
SJa, dubbele input kan gewoon niet als Pri-Key. ;) Als je meermaals dezelfde film wil opslaan moet je dus wel een ID er voor zetten.

Ik weet niet of MySQL het lust, maar je zou een composite pri-key kunnen gebruiken, dus dat de combi van twee kolomen een unieke waarde maakt. In theorie kan dat iig. Nooit zelf gedaan met MySQL, ik normaliseer ;)

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
Ik heb filmtitel+genre gezamelijk uniek gemaakt, zoals je voorstelde. Zo had ik het ook in mijn FCO-IM casetalk ding gedaan. Alleen kon ik het daar niet netjes exporteren en in myphpadmin importeren. Dus heb het toen handmatig gedaan en dit kennelijk verkeerd overgenomen.

Nu werkt het in ieder geval :)

Edit: je maakt je ondertitel wel waar ;) . Ik zal even uitleggen hoe mijn database eruit ziet, naar aanleiding van je vorige edit:

1 grotere tabel (6 kolommen) met standaard film info en kwaliteit (720p, 1080p, DVD5 etc..)
1 tabel met de "plaats", 1 van de 3 opslagplaatsen van mijn films
1 tabel met ondertiteling
1 tabel met genres.

Het doel is gewoon een overzicht van de honderden GB's aan data.

Ik zou idd met ID's kunnen werken en een nieuwe tabel maken. Dat maakt de queries wel ingewikkelder.

We hebben zeker wel de basis dingen geleerd voordat we hiermee begonnen. Eerst standaard zoekqueries en daarna het opzetten van een structuur.

[ Voor 55% gewijzigd door Vanx op 10-03-2010 19:25 ]


Acties:
  • 0 Henk 'm!

  • keejoz
  • Registratie: November 2008
  • Laatst online: 28-08 15:53
Of je gebruikt gewoon extract(); :-)

Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
keejoz schreef op woensdag 10 maart 2010 @ 19:23:
Of je gebruikt gewoon extract(); :-)
Van wat ik van de karige info op phpmanual moet opmaken, kan ik er niet zoveel mee?

Care to explain? :)

Heb ook even foreach gebruikt, met de for-lus had ik wat vage lege queries. Die is er duidelijk niet voor bedoeld ;)

Nu gaan fetchen, moet een stuk makkelijker gaan met deze array kennis.

edit: done en met succes *O*
McKaamos schreef op dinsdag 09 maart 2010 @ 21:20:
PHP:
1
2
3
4
5
foreach($row = mysql_fetch_assoc($result)) {
 echo "<tr>
 <td>".$row['firstname']."</td>
 <td>".$row['lastname']."</td>
</tr>"


In dit voorbeeld is $row een array variabele waarin lades zitten met de namen van de tabel kolommen.
Elke keer dattie een stapje verder gaat is $row gevuld met de volgende regel van de tabel, zodat je dus nieuwe gegevens echo'd tot je het einde van het resultaat van de query hebt bereikt. ;)

Oh, en als je mysql_fetch_array doet ipv mysql_fetch_assoc krijg je een genummerde array, met de kolommen genummerd van 0 tot x, afhankelijk van het aantal kolommen.
Benoemd (associative, aka assoc) geeft elke lade van de array de naam van de kolom, wat het overzichtelijker maakt.
Die for each moet toch moet toch een while zijn? Heb een half uur lopen kijken, maar met for each elke keer error. Met een while liep het scriptje in 1x correct.

mysql_fetch_assoc is trouwens erg handig :) , veel beter dan de standaard (volgens de informatica site), waarin ik gewoon een row importeer en met list een naam geef.

[ Voor 57% gewijzigd door Vanx op 10-03-2010 20:58 ]


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
PHP:
1
2
3
4
5
6
7
8
9
$result=mysql_query("select `ID` from `film` where `Titel` = '$titel' ;");
while( $ID = mysql_fetch_assoc($result)){  

foreach($genre as $key => $val) { 
mysql_query("INSERT INTO `film genre` (`FilmID` , GenreID )
VALUES ('$result', '$val');")
or die (mysql_error());
echo "<br> genre";
}


Ik heb toch een ID aan een film gekoppeld, helaas geeft het wat kleine complicaties. Ik heb ook een losse tabel met GenreID's gemaakt, van 1 tot 25 en de juiste value in het html script gezet.

Maar om dan in de Genre tabel de goeie GenreID's aan de FilmID's te hangen is nog best lastig. Dan moet ik namelijk eerst de ID van de film ophalen in de "hoofd" tabel en die in de query stoppen om op te slaan als FilmID met enkele losse GenreID's (meerdere rijen voor 1 film dus).

Bovenstaande gaf mij alleen een "0" als FilmID of waarschijnlijk dus een verkeerde query. Ik zie het niet, jullie wel?

Het is ook zo omslachtig dat het vast makkelijker kan.

Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 22:37
VALUES ('$result', '$val');")
:?

$result is een resource, geen variabele die het id bevat... dat zal $ID["ID"] moeten zijn. ;)

edit:
Die while is trouwens overbodig, als het goed is geeft je query maar 1 resultaat terug.

[ Voor 24% gewijzigd door Xander op 12-03-2010 21:30 ]

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
McKaamos schreef op woensdag 10 maart 2010 @ 06:59:
[...]
$_POST is uberhaupt al een array, stop je er meer arrays in, dan heet het een multidimensionele array ;)
Als je <form> element een name attribuut heeft komt er eerst een set blokhaken met de formnaam en dan pas de blokhaken met andere variabelen en arrays. Dan issie dus multidimensioneel ;)
Op die manier kan je, iig in theorie, ook meerdere forms posten. Geloof niet dat dat lukt met 1 submitknopje, maar toch :P
Wat voor exotische build van PHP gebruik jij dan dat je dat krijgt? Hoe wilde je meerdere forms in 1 keer submitten trouwens? :)

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Cartman! schreef op vrijdag 12 maart 2010 @ 21:51:
[...]

Wat voor exotische build van PHP gebruik jij dan dat je dat krijgt? Hoe wilde je meerdere forms in 1 keer submitten trouwens? :)
Das niet exotisch hoor ;) Gewoon PHP5 ;)
En meerdere forms submitten lukt je niet met HTML, maar ik gok dat het je wel lukt met javascript ;)
Vanx schreef op woensdag 10 maart 2010 @ 20:04:
[...]


Van wat ik van de karige info op phpmanual moet opmaken, kan ik er niet zoveel mee?

Care to explain? :)

Heb ook even foreach gebruikt, met de for-lus had ik wat vage lege queries. Die is er duidelijk niet voor bedoeld ;)

Nu gaan fetchen, moet een stuk makkelijker gaan met deze array kennis.

edit: done en met succes *O*


[...]


Die for each moet toch moet toch een while zijn? Heb een half uur lopen kijken, maar met for each elke keer error. Met een while liep het scriptje in 1x correct.

mysql_fetch_assoc is trouwens erg handig :) , veel beter dan de standaard (volgens de informatica site), waarin ik gewoon een row importeer en met list een naam geef.
Excuus, dat moet idd while zijn. Foreach zal de array $row gaan aflopen :P
Assoc mode is idd handig. Scheelt een hoop gekloot, ook wanneer je bijvoorbeeld extra kolommen gaat toevoegen aan je tabel. Zit je niet steeds te kloten met opgeschoven nummertjes enzo.

[ Voor 57% gewijzigd door McKaamos op 12-03-2010 23:06 ]

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 00:29
McKaamos schreef op vrijdag 12 maart 2010 @ 23:03:
[...]

Das niet exotisch hoor ;) Gewoon PHP5 ;)
En meerdere forms submitten lukt je niet met HTML, maar ik gok dat het je wel lukt met javascript ;)
Wat we willen zeggen is dat dat normaal dus niet gebeurt. Misschien zou je wel met javascript meerdere forms kunnen samenvoegen tot een nieuw form waarbij je alle veldnamen postfixt met [formNaam] (en dan wat extra moeite voor namen waar al blokhaken in staan) en dat dan verzenden om dit effect te krijgen, maar ik zou niet weten waarom.

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 11-09 22:10

krvabo

MATERIALISE!

McKaamos schreef op woensdag 10 maart 2010 @ 17:58:
[...]

Titel moet je sowieso niet als primary key gebruiken trouwens ;) Daar moet je eigenlijk een ID nummer voor nemen. Apparte kolom daar voor toevoegen die je b.v. film_id noemt, setten als INT of BIGINT (afhankelijk van hoeveel je denkt dat er in de DB moet) primary key en auto_increment ;)

Stukje database normalisatie, zoals dat heet.
Stukje *denormalisatie* bedoel je.
Je geeft hem het idee dat je een numeriek auto-incremental ID (identifier) moet gebruiken.. Een makkelijker voorbeeld van denormalisatie kun je niet vinden.
Een ID is álléén handig als je een key hebt uit veel velden, en je wilt bijvoorbeeld in een url meegeven welk record je bedoelt. Anders zou je dus alle values door moeten gaan geven.
De reden dat je het bij websites heel veel ziet is simpel: het is korter om een nummer mee te geven dan meerdere waardes.

Zeker aangezien het een leerproces betreft (over databases) stuur je hem glorieus (maar vast goedbedoeld) de verkeerde kant op. Dat een ID hier wellicht handig is, is een ander punt.
Als hij op school aankomt met een database vol ID's dan krijgt hij van elke fatsoenlijke databasedocent daar een opmerking over, zolang je niet góed kunt beargumenteren waarom je een ID wilt gebruiken.


Verder wil ik qua php nog graag opmerken dat het volgende netter is:

In plaats van:
PHP:
1
mysql_query("INSERT INTO `film genre` (`FilmID`, GenreID) VALUES ('$result', '$val');")

het volgende:
PHP:
1
mysql_query("INSERT INTO `film genre` (`FilmID`, GenreID) VALUES ('".$result."', '".$val."');")

Let verder ook op het punt dat je data veilig wegstuurt naar je database (voor beginners: mysql_real_escape_string()) en dat puntkomma's met mysql_query niet nodig zijn. Je kunt immers niet meerdere queries met één function call doen.
Wat je dan weer wel kunt doen (bij insert) is het volgende:
PHP:
1
2
3
4
mysql_query("INSERT INTO `film genre` (`FilmID`, GenreID) 
VALUES ('".$result."', '".$val."'),  
('".$result2."', '".$val2."'),  
('".$result3."', '".$val3."')")


Overigens kun je het ook nog korter schrijven, als je alle velden invult 'zoals ze in de database staan':
PHP:
1
mysql_query("INSERT INTO `film genre` VALUES ('".$result."', '".$val."')")

of als je veelvuldig inserts én updates schrijft is de volgende syntax ook handig:
PHP:
1
2
3
4
5
6
mysql_query("
INSERT INTO `film genre`
SET
  FilmID = '".$result."',
  GenreID = '".$val."'
");

Zoals je ziet kun je dan makkelijk het hele 'SET'-gebeuren kopiëren. Zeer handig als je iets in je code moet veranderen.

Daarnaast wil ik je aanraden zo min mogelijk spaties te gebruiken in namen, aangezien je dan (in mysql) backtics (`) moet gebruiken.

Php parset een single quote ' sneller dan een dubbelquote aangezien hij dan niet zoekt naar variabelen binnen de string. Je ziet echter heel vaak dat mensen wél dubbelquote gebruiken bij sql-statements..omdat je bij tekst alles netjes tussen ' hoort te zetten ;)

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
krvabo schreef op zaterdag 13 maart 2010 @ 00:31:

De reden dat je het bij websites heel veel ziet is simpel: het is korter om een nummer mee te geven dan meerdere waardes.
En de index neemt minder schijf- en geheugenruimte in beslag en zoeken in de index zal sneller worden, ook worden gerelateerde tabellen kleiner (en hun indices).
Verder wil ik qua php nog graag opmerken dat het volgende netter is:

In plaats van:
PHP:
1
mysql_query("INSERT INTO `film genre` (`FilmID`, GenreID) VALUES ('$result', '$val');")

het volgende:
PHP:
1
mysql_query("INSERT INTO `film genre` (`FilmID`, GenreID) VALUES ('".$result."', '".$val."');")

...
Php parset een single quote ' sneller dan een dubbelquote aangezien hij dan niet zoekt naar variabelen binnen de string. Je ziet echter heel vaak dat mensen wél dubbelquote gebruiken bij sql-statements..omdat je bij tekst alles netjes tussen ' hoort te zetten ;)
Wat is daar netter aan? "blah $variabele blah" is gewoon een onderdeel van php, er staat in de handleiding netjes beschreven hoe het werkt. Ook de parsesnelheid is totaal niet relevant, die database insert duurt een miljoen keer langer dan het parsen van een string.
Daarnaast wil ik je aanraden zo min mogelijk spaties te gebruiken in namen, aangezien je dan (in mysql) backtics (`) moet gebruiken.
Je ziet hem al aankomen, wat is er mis met backtics? Vooral wanneer de spaties worden gebruikt om de naamgeving te verduidelijken.

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 11-09 22:10

krvabo

MATERIALISE!

_js_ schreef op zaterdag 13 maart 2010 @ 00:48:
[...]
En de index neemt minder schijf- en geheugenruimte in beslag en zoeken in de index zal sneller worden, ook worden gerelateerde tabellen kleiner (en hun indices).
Schijfruimte: een extra ID neemt ook ruimte in
Geheugengebruik: een extra ID neemt ook ruimte in
Gerelateerde tabellen kleiner: Ja, dat komt omdat je dan gaat denormaliseren.
Zoeken:
If a multiple-column index exists on col1 and col2, the appropriate rows can be fetched directly. If separate single-column indexes exist on col1 and col2, the optimizer tries to find the most restrictive index by deciding which index will find fewer rows and using that index to fetch the rows.

If the table has a multiple-column index, any leftmost prefix of the index can be used by the optimizer to find rows. For example, if you have a three-column index on (col1, col2, col3), you have indexed search capabilities on (col1), (col1, col2), and (col1, col2, col3).

MySQL can't use a partial index if the columns don't form a leftmost prefix of the index. Suppose that you have the SELECT statements shown here:

SELECT * FROM tbl_name WHERE col1=val1;
SELECT * FROM tbl_name WHERE col2=val2;
SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

If an index exists on (col1, col2, col3), only the first of the preceding queries uses the index. The second and third queries do involve indexed columns, but (col2) and (col2, col3) are not leftmost prefixes of (col1, col2, col3).
Zolang jij je where's in goede volgorde opbouwt merk je daar niets van.
[...]

Wat is daar netter aan? "blah $variabele blah" is gewoon een onderdeel van php, er staat in de handleiding netjes beschreven hoe het werkt. Ook de parsesnelheid is totaal niet relevant, die database insert duurt een miljoen keer langer dan het parsen van een string.
Wat er netter aan is?
Het is overzichtelijker, je IDE/editor kan het goed highlighten en het is sneller. Dat het microoptimalisatie is wil ik best toegeven, maar als je het gewoon direct zo leert schrijven dan scheelt het je 1) geen extra ontwikkeltijd, 2) in parsetime. Variabelen in je string zetten is voor mij een typisch voorbeeld van ranzige code en waar ik het tegenkom in andere scripts zal ik het altijd aanpassen.
[...]
Je ziet hem al aankomen, wat is er mis met backtics? Vooral wanneer de spaties worden gebruikt om de naamgeving te verduidelijken.
Extra typwerk? Daarnaast worden ze bij mysql ook gebruikt om namen te kunnen gebruiken die eigenlijk gereserveerd zijn.. En dat zijn er nogal wat: Klik
Als je dus "show" wilt gebruiken als column name dan zul je hem tussen backtics moeten zetten. Ikzelf vind het overzichtelijk om het dan alleen bij reserved words te doen, zodat meteen duidelijk is dat daar iets speciaals mee is.
Het is niet fout, ik heb het zelf ook lang gebruikt, maar het is gewoon extra typwerk. Als je geen spaties gebruikt dan is het niet nodig. En vaak heb je ook geen spaties nodig.
Een genormaliseerde database heeft zelfstandige naamwoorden als tabelnaam, enkelvoud.
- Klant
- User
- Fiets

Als je nou zegt 'maar wat nou als ik een tabel wil waar ik alle gestolen fietsen in wil bijhouden': dat is weer denormaliseren ;)

Kijk, ik weet zelf ook wel dat je niet altijd zelfstandige naamwoorden wilt gebruiken, al is het alleen maar vanuit oogpunt dat aan de hand van de tabelnaam duidelijk is wat er in zit.
Dat neemt echter niet weg dat spaties onhandig zijn, en vereisen dat je meer typt. Waarom zou je het jezelf moeilijker maken dan het hoeft te zijn.
Vergeet ook niet dat als je gaat joinen je al snel onhandige dingen krijgt:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT *
FROM
 `nieuwe gebruiker`
INNER JOIN
 `gestolen auto`
ON
  `nieuwe gebruiker`.id = `gestolen auto`.`user id`
WHERE
  `gestolen auto`.registratiedatum = '2010-09-03'
AND
  `nieuwe gebruiker`.`werkend sinds` > '2009-03-23'
ORDER BY
  `gestolen auto`.kenteken
ASC

Ik vind het er niet makkelijker op worden zegmaar. (Afgezien van het nut van de query, de volgorde van selecteren uit de tabel en de naamgeving)

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
McKaamos schreef op vrijdag 12 maart 2010 @ 23:03:
[...]

Das niet exotisch hoor ;) Gewoon PHP5 ;)
En meerdere forms submitten lukt je niet met HTML, maar ik gok dat het je wel lukt met javascript ;)
Kun je daar een testcase van maken voor me? Ik krijg het niet voor elkaar en ben erg benieuwd hoe je dat zou doen :)

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Cartman! schreef op zaterdag 13 maart 2010 @ 11:20:
[...]

Kun je daar een testcase van maken voor me? Ik krijg het niet voor elkaar en ben erg benieuwd hoe je dat zou doen :)
Nou, ik heb het zelf nog niet geprobeerd te submitten. Ik weet wel dat wanneer je het name attribuut toekent aan een form element, je dan $_POST['formnaam'] en dan pas je ingevulde velden krijgt.
Tis denk ik nuttiger voor wanneer je meerdere forms op ee pagina hebt staan en je dan weet wat je er mee moet doen op basis van de form die je hebt binnengekregen.

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
krvabo schreef op zaterdag 13 maart 2010 @ 00:31:

Zeker aangezien het een leerproces betreft (over databases) stuur je hem glorieus (maar vast goedbedoeld) de verkeerde kant op. Dat een ID hier wellicht handig is, is een ander punt.
Als hij op school aankomt met een database vol ID's dan krijgt hij van elke fatsoenlijke databasedocent daar een opmerking over, zolang je niet góed kunt beargumenteren waarom je een ID wilt gebruiken.
Ik heb juist even overlegd met de leraar. Hij stelde deze "verbeterde" versie voor. Dus dat zit wel goed ;)

Rest van je tips zal ik meenemen, variabele uit de " ", staat inderdaad een stuk mooier. Ik was eerst allang blij dat mijn query in php eindelijk deed wat het moet doen.
PHP:
1
2
3
4
5
6
mysql_query("
INSERT INTO `film genre`
SET
  FilmID = '".$result."',
  GenreID = '".$val."'
");

Zoals je ziet kun je dan makkelijk het hele 'SET'-gebeuren kopiëren. Zeer handig als je iets in je code moet veranderen.

Daarnaast wil ik je aanraden zo min mogelijk spaties te gebruiken in namen, aangezien je dan (in mysql) backtics (`) moet gebruiken.
Ik heb maar 1 tabel met een spatie in de DB, als ik die eruit haal dan kunnen alle backtics weg, dat is wel handig.

Die SET is ook leuk, maar voor mijn doel nog niet zo zinnig, ik zal hem zeker onthouden.

[ Voor 5% gewijzigd door Vanx op 13-03-2010 15:25 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Over dit stukje code:

PHP:
1
2
3
4
5
6
mysql_query(" 
INSERT INTO `film genre` 
SET 
  FilmID = '".$result."', 
  GenreID = '".$val."' 
");


Ik ga er voor het gemak even vanuit dat je FilmID en GenreID integers zijn in de database en dan hoor je ze niet tussen quotes te plaatsen. Dan wordt het dus zo:

PHP:
1
2
3
4
5
6
mysql_query(" 
INSERT INTO `film genre` 
SET 
  `FilmID`  = ". (int)$result .", 
  `GenreID` = ". (int)$val ." 
");


Je gebruikt dan wel (int) voor je variabele, om te garanderen dat je ook daadwerkelijk een getal gaat invoeren. Als het geen getallen zijn, dan moet het waarschijnlijk zo in jou geval:

PHP:
1
2
3
4
5
6
mysql_query(" 
INSERT INTO `film genre` 
SET 
  `FilmID`  = '". mysql_real_escape_string($result) ."', 
  `GenreID` = '". mysql_real_escape_string($val) ."' 
");
Of je moet de escape al ergens anders (eerder) doen.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
McKaamos schreef op zaterdag 13 maart 2010 @ 12:54:
[...]

Nou, ik heb het zelf nog niet geprobeerd te submitten. Ik weet wel dat wanneer je het name attribuut toekent aan een form element, je dan $_POST['formnaam'] en dan pas je ingevulde velden krijgt.
Tis denk ik nuttiger voor wanneer je meerdere forms op ee pagina hebt staan en je dan weet wat je er mee moet doen op basis van de form die je hebt binnengekregen.
Waarmee je dus eigenlijk zegt dat je het niet zelf geprobeerd hebt. Ik zal je verklappen dat bij normaal gebruik het niet zo werkt namelijk. Wellicht ben je in de wat met javascript?

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 11-09 22:10

krvabo

MATERIALISE!

HuHu schreef op zaterdag 13 maart 2010 @ 15:41:
Over dit stukje code:

PHP:
1
2
3
4
5
6
mysql_query(" 
INSERT INTO `film genre` 
SET 
  FilmID = '".$result."', 
  GenreID = '".$val."' 
");


Ik ga er voor het gemak even vanuit dat je FilmID en GenreID integers zijn in de database en dan hoor je ze niet tussen quotes te plaatsen. Dan wordt het dus zo:
Je hebt gelijk, ik ben het vannacht in allerijl vergeten aan te passen ;)
Het ging ook meer over de syntax van SET binnen een INSERT, daar je dan met een simpel statement je sql simpel kunt 'genereren':

PHP:
1
2
3
4
5
$sSql = ($bIsInsert ? 'INSERT INTO' : 'UPDATE' ). " tabel
SET
  waarde1 = '".$waarde1."',
  waarde2 = '".$waarde2."'
". ($bIsInsert ? '' : ' WHERE id = '.$iId);


Dit zodat je dan je sql maar één keer hoeft aan te passen voor je updates en inserts als er iets veranderd. Bij veel where's wordt het natuurlijk al wat onhandiger.

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Voor UPDATES en een INSERT als er iets veranderd heb je de INSERT INTO ... ON DUPLICATE KEY UPDATE notatie.

Acties:
  • 0 Henk 'm!

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 18:17
McKaamos schreef op woensdag 10 maart 2010 @ 17:47:
Ik zie het al, de semicolon mist aan het einde van de query ;)
Die is niet verplicht aan het einde van een query, tenzij je mysql_db_query gebruikt, en meerdere query's tegelijk uitvoert. Maar dat wil je sowieso niet i.v.m. sql injection en dat soort dingen.
McKaamos schreef op woensdag 10 maart 2010 @ 18:11:
Ik weet niet of MySQL het lust, maar je zou een composite pri-key kunnen gebruiken, dus dat de combi van twee kolomen een unieke waarde maakt. In theorie kan dat iig. Nooit zelf gedaan met MySQL, ik normaliseer ;)
Ja je kan 2 kolommen als primary key gebruiken. Dat heeft btw niets te maken met normaliseringen maar met een ontwerpkeuze :)
Vanx schreef op woensdag 10 maart 2010 @ 19:21:
1 grotere tabel (6 kolommen) met standaard film info en kwaliteit (720p, 1080p, DVD5 etc..)
1 tabel met de "plaats", 1 van de 3 opslagplaatsen van mijn films
1 tabel met ondertiteling
1 tabel met genres.
Dat werkt op zich goed, alleen hoe koppel je je films aan genres, plaatsen en subtitles dan?

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Cartman! schreef op zaterdag 13 maart 2010 @ 16:39:
[...]

Waarmee je dus eigenlijk zegt dat je het niet zelf geprobeerd hebt. Ik zal je verklappen dat bij normaal gebruik het niet zo werkt namelijk. Wellicht ben je in de wat met javascript?
Met de name attributen heb ik wel gedaan, meerder tegelijk submitten niet.
Ik weet wel dat het er uit komt zoals ik aangaf.

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 18:17
McKaamos schreef op zaterdag 13 maart 2010 @ 18:11:
[...]

Met de name attributen heb ik wel gedaan, meerder tegelijk submitten niet.
Ik weet wel dat het er uit komt zoals ik aangaf.
Volgens mij is het niet mogelijk om meerdere forms te submitten.

Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
Phoenix1337 schreef op zaterdag 13 maart 2010 @ 18:10:

Dat werkt op zich goed, alleen hoe koppel je je films aan genres, plaatsen en subtitles dan?
Dat was gewoon via de titel. Maar ik heb nu ID's gemaakt per film en een losse tabel met een ID voor elke genretype.

Dus nu kan ik koppelen via die ID's. Ik heb alle variabelen ook buiten de aanhalingstekens gehaald en de backtics weggehaald, waar ze niet nodig zijn.

Als ik een inlog scherm wil maken, zodat alleen "admins" via het formulier nieuwe films kunnen toevoegen. Maakt het dan uit of ik een session start of cookie maak?

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 11-09 22:10

krvabo

MATERIALISE!

HuHu schreef op zaterdag 13 maart 2010 @ 18:05:
Voor UPDATES en een INSERT als er iets veranderd heb je de INSERT INTO ... ON DUPLICATE KEY UPDATE notatie.
Totdat je iets uitgebreidere controle wilt ;)
Ja, het werkt, en ja, het werkt goed op veel momenten, maar er zijn ook genoeg momenten waarop het niet werkt. :)
Vanx schreef op zaterdag 13 maart 2010 @ 18:24:
[...]

Als ik een inlog scherm wil maken, zodat alleen "admins" via het formulier nieuwe films kunnen toevoegen. Maakt het dan uit of ik een session start of cookie maak?
Cookies worden opgeslagen op de pc van de gebruiker en zijn aanpasbaar, sessies niet ;)

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
McKaamos schreef op zaterdag 13 maart 2010 @ 18:11:
[...]

Met de name attributen heb ik wel gedaan, meerder tegelijk submitten niet.
Ik weet wel dat het er uit komt zoals ik aangaf.
Laat me dat dan eens zien dan, ik zou graag een testcase zien want ik ben dat in een hoop jaar PHP-tijd dat nog nooit tegengekomen. Meerdere tegelijk submitten is volgens mij ook helemaal niet mogelijk, een submit is gewoon 1 request op je webserver, niet meerdere die in 1 verwerkt worden. Volgens mij klopt er niks van je verhaal dus, sorry.

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 17:22
@Cartman!: Ik denk dat die in de war is met JavaScript aangezien je daar forms kan benaderen op naam. Bij PHP is dat gewoonweg niet mogelijk omdat zoals je zelf ook al aangeeft maximaal maar 1 form te gelijk kan worden gepost. (Anders zouden de resultaten moeten worden gecombineerd in een form). Zoals je zelf ook reeds eerder aangaf :)

@krvabo:
Totdat je iets uitgebreidere controle wilt ;)
Ja, het werkt, en ja, het werkt goed op veel momenten, maar er zijn ook genoeg momenten waarop het niet werkt. :)
Zou je dit eens willen uitleggen? Voor zover ik weet doet de ON DUPLICATE KEY ook gewoon zijn werk en draait een ander statement.

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 11-09 22:10

krvabo

MATERIALISE!

Manuel schreef op zaterdag 13 maart 2010 @ 20:31:

@krvabo:

[...]
Zou je dit eens willen uitleggen? Voor zover ik weet doet de ON DUPLICATE KEY ook gewoon zijn werk en draait een ander statement.
Ik ben het zelf eens tegengekomen bij het verwerken van zeer dynamische data uit xml-feeds van affiliates, maar ik kan het me niet meer precies herinneren, wat zoeken bracht me bij het volgende:
In general, you should try to avoid using an ON DUPLICATE KEY clause on tables with multiple unique indexes.
Daarnaast werkt ook last_insert_id() niet (goed) meer. mysql_affected_rows() geeft schijnbaar ook niet altijd handige results meer. Overigens moet je (volgens de comments op die pagina) ook uitkijken met het updaten van de auto_increment-value tijdens een ON DUPLICATE KEY.

Daarnaast kun je natuurlijk ON DUPLICATE KEY gewoon helemaal niet gebruiken als je alleen een auto-increment primairy key hebt.

Ik kan even niet precies meer vinden wáárom ON DUPLICATE KEY niet voldeed voor me, maar zo vaak komt het dan ook niet voor. Begrijp me niet verkeerd, het is een prima oplossing welke ik zelf ook vaak genoeg gebruik :)

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 17:22
Ja oke, dan zou het dus eigenlijk makkelijker zijn om een REPLACE INTO statement uit te voeren dan weet je zeker dat als het resultaat toch bestaat het gewoon wordt vervangen. Dat scheelt ook weer wat voor in de code aan de checks.

Verder wel een interessant weetje die je hier geeft, het wordt eens tijd dat ik me er eens in ga verdiepen :)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Manuel schreef op zaterdag 13 maart 2010 @ 20:31:
@Cartman!: Ik denk dat die in de war is met JavaScript aangezien je daar forms kan benaderen op naam. Bij PHP is dat gewoonweg niet mogelijk omdat zoals je zelf ook al aangeeft maximaal maar 1 form te gelijk kan worden gepost. (Anders zouden de resultaten moeten worden gecombineerd in een form). Zoals je zelf ook reeds eerder aangaf :)
Dat denk ik dus ook maar het zou prettig zijn als hij daar zelf ook achterkomt ipv. blijft rondstrooien met informatie die wellicht niet klopt ;)

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Cartman! schreef op maandag 15 maart 2010 @ 08:42:
[...]

Dat denk ik dus ook maar het zou prettig zijn als hij daar zelf ook achterkomt ipv. blijft rondstrooien met informatie die wellicht niet klopt ;)
Ik denk dat jullie niet helemaal goed lezen ;)
Wat ik zeg is precies wat jullie zeggen.

Even uitgewerkt:
HTML:
1
2
3
<form name="test" action="test.php" method="post">
 <input type="text" name="inhoud"/>
</form>


Wat in PHP opgeroepen wordt als:
PHP:
1
$_POST['test']['inhoud']


Wanneer je het name attribuut weglaat in de form-tag kan je af met dit:
PHP:
1
$_POST['inhoud']


In HTML is het niet mogelijk om meerdere forms te submitten, maar misschien kan dat met javascript wel, waardoor je b.v. forms test1 en test2 kan hebben.

PHP:
1
2
$_POST['test1']['inhoud']
$_POST['test2']['inhoud']

Waarin dus beide "inhoud" items verschillend zijn.

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12-09 10:03

Creepy

Tactical Espionage Splatterer

(jarig!)
McKaamos schreef op maandag 15 maart 2010 @ 09:06:
[...]

Ik denk dat jullie niet helemaal goed lezen ;)
Wat ik zeg is precies wat jullie zeggen.

Even uitgewerkt:
HTML:
1
2
3
<form name="test" action="test.php" method="post">
 <input type="text" name="inhoud"/>
</form>


Wat in PHP opgeroepen wordt als:
PHP:
1
$_POST['test']['inhoud']


Wanneer je het name attribuut weglaat in de form-tag kan je af met dit:
PHP:
1
$_POST['inhoud']


In HTML is het niet mogelijk om meerdere forms te submitten, maar misschien kan dat met javascript wel, waardoor je b.v. forms test1 en test2 kan hebben.

PHP:
1
2
$_POST['test1']['inhoud']
$_POST['test2']['inhoud']

Waarin dus beide "inhoud" items verschillend zijn.
Ik denk dat je zelf niet goed leest of dit nooit hebt getest. Aangezien je maar 1 formulier kan posten gebeurt dit dus niet. tenzij je m.b.v. javascript een eigen POST request maakt. Maar een standaard formulier POST levert je in de $_POST variable dus direct de velden van het formulier op.
HTML:
1
2
3
4
5
6
7
8
9
<html> 
<head></head> 
<body> 
<form id="form1" name="form1" action="showit.php" method="POST"> 
<input type="text" id="val1" name="val1"> 
<input type="submit" value="Send" name="button"> 
</form> 
</body> 
</html>

Levert op (print_r($_POST):
code:
1
2
3
4
Array (
  [val1] => lkuhljkh
  [button] => Send
)

Dus geen extra array met daarin de name van het formulier.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Daarom vroeg ik, wat voor exotische build van PHP gebruik je, of is het een setting oid. Ik heb dat nog nooit voor elkaar gekregen, mijn resultaat is zoals die van Creepy. Zet eens een testcase online op je server en demonstreer het.

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
@ het hele verhaal van zaterdag over wat een betere notatie is om variabelen in een query te stoppen: Geen van allen. Ik vindt de notatie waar je uit de string springt en je variabelen erin concateneert (?) gewoon lelijk in je code.

Geeft dan de voorkeur aan prepared statements, da's veel netter, veiliger en sneller, en je hebt het hele probleem van quotes toevoegen of strings escapen ook uit de weg.

PHP:
1
2
3
4
5
$db_connection = new mysqli("localhost", "user", "pass", "db");
$statement = $db_connection->prepare("INSERT INTO `film genre` SET FilmID = ?, GenreID = ?");
$statement->bind_param("i", $filmid);
$statement->bind_param("i", $genreid);
$statement->execute();


en dan kan MySQL er ook nog genoeg aan optimaliseren - meer dan met geconcatenate queries. mysql_query() is ondertussen antiek.

Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
Nou ik ben weer een stuk verder, input formulier is voorzien van "admincheck" en de overzichtspagina is ook netjes opgemaakt en weergegeven. :)

Hoe kan ik het beste laten "sorteren"? Dus als ik zeg dat IMDb cijfer >8 moet zijn, dan moet de query dat ook geven (de query zelf is het probleem niet).

Hoe is dat het best te doen in PHP? Gewoon een form met submit (of "sorteer") knopje maken? Of kan het handiger?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Als je gewoon een bepaalde sortering wil aan een lijstje moet je gewoon een linkje maken daarheen met de juiste params in je linkje om dat te regelen.

Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
Cartman! schreef op dinsdag 16 maart 2010 @ 13:09:
Als je gewoon een bepaalde sortering wil aan een lijstje moet je gewoon een linkje maken daarheen met de juiste params in je linkje om dat te regelen.
Dus linken in overzicht.php naar overzicht.php?id=8 en dan in de php die waarde ophalen?

Daar ga ik even naar kijken :)

edit: druk bezig met alles in urls proppend en de goede query erbij maken, maar nu zit ik op een error waar ik niet uitkom...
PHP:
1
2
3
4
5
6
print_r($_GET);
$result=mysql_query("select * from film 
where `IMDb score` >= ".$_GET['cijfer']." 
AND `IMDb #250` <= ".$_GET['top250']." 
AND DUUR < ".$_GET['duur']." ". 
(($_GET['bekeken'] == 'Beide') ? '' : 'AND Bekeken = '.$_GET['bekeken']) );


output:
code:
1
2
Array ( [cijfer] => 1 [top250] => 251 [duur] => 999 [bekeken] => Ja )
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in W:\www\Overzicht.php on line 61


Die rare array waarden zijn om ervoor te zorgen dat die sortering gewoon alle films selecteert.

Het ging goed, tot ik die bool erin propte. In die kolom in de DB staat alleen Ja en Nee, en als de gebruiker dus niet daarop wil selecteren moet dat AND "voorwaarde" stukje niet worden gebruikt.

[ Voor 54% gewijzigd door Vanx op 16-03-2010 22:02 ]


Acties:
  • 0 Henk 'm!

  • Vanx
  • Registratie: Augustus 2008
  • Laatst online: 01-08 20:34
Nog even over hierboven.
PHP:
1
2
3
4
5
6
7
8
<?php
print_r($_GET);
$result=mysql_query("select * from film 
where `IMDb score` >= ".$_GET['cijfer']." 
AND `IMDb #250` <= ".$_GET['top250']." 
AND DUUR < ".$_GET['duur']." ". 
(($_GET['bekeken'] == 'Beide') ? '' : 'AND Bekeken = '.$_GET['bekeken']) );
?>


Ik moet dus de tweede $_GET['bekeken'] tussen ' tekens zetten om als string gezien te worden. Ik weet alleen echt niet hoe dat moet.

Ik heb ook lopen klooien met ESCAPE '\' , maar dat lukte niet echt...

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
PHP:
1
2
3
4
5
6
7
8
9
print_r($_GET);

$result = mysql_query("
SELECT * 
FROM `film`
WHERE `IMDb score` >= ". (int)$_GET['cijfer'] ."
  AND `IMDb #250`  <= ". (int)$_GET['top250'] ."
  AND `DUUR`       <  ". (int)$_GET['duur']   ."
 ". ((isset($_GET['bekeken']) && $_GET['bekeken'] == 'Beide') ? "" : "AND Bekeken = '". mysql_real_escape_string($_GET['bekeken']) ."'") );


Nog makkelijker, aangezien je $_GET['bekeken'] blijkbaar Beide moet bevatten:

PHP:
1
2
3
4
5
6
7
8
9
print_r($_GET);

$result = mysql_query("
SELECT * 
FROM `film`
WHERE `IMDb score` >= ". (int)$_GET['cijfer'] ."
  AND `IMDb #250`  <= ". (int)$_GET['top250'] ."
  AND `DUUR`       <  ". (int)$_GET['duur']   ." 
 ". ((isset($_GET['bekeken']) && $_GET['bekeken'] == 'Beide') ? "" : "AND Bekeken = 'Beide'") );

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Vanx schreef op dinsdag 16 maart 2010 @ 23:06:
Nog even over hierboven.
PHP:
1
2
3
4
5
6
7
8
<?php
print_r($_GET);
$result=mysql_query("select * from film 
where `IMDb score` >= ".$_GET['cijfer']." 
AND `IMDb #250` <= ".$_GET['top250']." 
AND DUUR < ".$_GET['duur']." ". 
(($_GET['bekeken'] == 'Beide') ? '' : 'AND Bekeken = '.$_GET['bekeken']) );
?>


Ik moet dus de tweede $_GET['bekeken'] tussen ' tekens zetten om als string gezien te worden. Ik weet alleen echt niet hoe dat moet.

Ik heb ook lopen klooien met ESCAPE '\' , maar dat lukte niet echt...
Sorry hoor, maar je stelt hier nu basic vraag na vraag. Je probleem kun je gewoon oplossen door eens te debuggen. Dit soort fouten moet je best zelf wat verder uit kunnen zoeken. Het is hier niet het grote Vanx vraagjes topic. Je originele probleem is opgelost, en daarom gaat deze op slot. Als je tegen nieuwe problemen oploopt kun je een nieuw topic openen. Maar die moeten natuurlijk wel aan de richtlijnen voldoen, anders gaat die ook op slot.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1

Dit topic is gesloten.