variabele veranderen op een welbepaalde manier
Ik ben al een tijdje bezig met php, maar nog steeds niet erg bedreven, ik heb hier enkele tips nodig:
Ik ben voor school een fotoboek aan het maken, ik heb gegevens doorgestuurd gekregen en ze in een mysql databse gezet, ze uitlezen is geen probleem, maar de foto's weergeven bij de juiste persoon is een probleem.
In de gegevens heb ik een stamnummer, de foto's hebben een bestandsnaam die verwant is aan dat stamnummer.
vb: in de database heb ik dit stamnummer: 200727677
de foto heeft deze naam: 0027677-32.jpg
Ik zou het stamnummer op deze manier moeten kunenn vervormen:
van 200727677 naar 27677, dan 0027677 en dan (en hier loop ik vast) 0027677-xx (xx omdat het bij elke foto anders is, er is geen constante te vinden, het probleem is dat ik op deze manier niet kan checken of de foto bestaat, ik doe voor elke foto een file_exists voordat ik hem weergeef).
Ik hoop dat ik duidelijk ben...
Bedankt!
Waarom sla je de correcte bestandsnaam niet op in de database? Dan bestaat het hele probleem toch niet?
Quote:
van 200727677 naar 27677, dan 0027677
Je hoeft toch alleen die eerste 2 er af te halen dan?
Maar dan nog, gewoon de correcte naam opslaan en klaar ben je. Is ook nog eens een fractie sneller.
Offtopic: In PostgreSQL kun je een fraaie sp maken in bv. PL/PERL om de bestanden (de images) te beheren. Hoef je dat niet meer met PHP te doen. Ook het af en toe (automatisch) opschonen kun je dan in zijn geheel in de database regelen, PgAgent doet wonderen.
Jan Koehoorn schreef op 28.01.2008 22:24:
Je hoeft toch alleen die eerste 2 er af te halen dan?
Quote:
van 200727677 naar 27677, dan 0027677
Je hoeft toch alleen die eerste 2 er af te halen dan?
nee er zit een heel klein verschil
oei, ik was dus niet duidelijk... gewoon de juiste naam opslaan, dat zou betekenen dat ik ongeveer 1000 stamnummers manueel moet aanpassen... ik hoopte op een beter oplossing. Maar die eerste 4 getallen eraf en vervangen door twee nullen zal wel lukken, maar dan die -xx erachter, en dan checken of die foto bestaat, daar gaat het fout.
Hoe weet je welke waarde er in xx moet komen?
Handmatig? Je kunt toch een slim scriptje schrijven die dat voor je doet? Automatisering heet dat... ;)
ok, bij het schrijven van dat slim scriptje heb ik dus hulp nodig, dat kan ik niet, want je weet nie welke waarde er in xx moet komen, dat is nu net het punt...
Okee, maar op een gegeven moment, ergens in je script, moet je toch een waarde aan de xx toekennen?
Zij er per 'stam' meerdere xx-jes of is dat er altijd maar 1?
Als ik de foto wil terugvinden via de verkenner zoek ik op 0027677, en dan zie ik dat de -xx -32 is. maar een andere manier is er niet, maar hoe doe ik dat met php.
nee er is geen verband tussen de stam en de xx-jes.
Gewijzigd op 01/01/1970 01:00:00 door Hans Vereyken
Dus je leest alle bestanden uit de map met foto's uit en achterhaalt per foto via de bestandsnaam het stamnummer. Vervolgens zet je de bestandsnaam bij het bijbehorende stamnummer in de database.
Als je die helemaal doorlopen hebt, kun je heel eenvoudig achterhalen van welke stamnummers nog geen foto's zijn. In dat geval zal er immers geen bestandsnaam aan het stamnummer gekoppeld zijn.
eerst alle foto-namen uitlezen, met een script vergelijken met het stamnummer en bij in de database zetten. Bij het genereren van het fotoboek die nieuwe nummers gebruiken.
Dat moet lukken, ik ga aan de slag, bedankt voor de tip.
Ik heb toch twee bedenkingen:
-er zijn meer foto's dan records in de database.
-Ik weet dat sommige records geen bijbehorende foto hebben.
Gaan deze twee dingen roet in het eten gooien of kan dat geprogrammeerd worden?
Records zonder foto: tja, dan zul je later toch voor elk record zonder foto nog een foto moeten gaan uploaden en moeten koppelen.
Hier is het scriptje:
Code (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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
include("config.php");
if ($handle = opendir("$fotos_studenten")){
echo "Logboek:<br>";
while (false!==($foto=readdir($handle))){
$foto1=substr("$foto",0,9);
dbLogin();
$query="SELECT $kolom_id,$kolom_stamnummer FROM $tabel WHERE $kolom_stamnummer='$foto1'";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
if($num=="1"){
echo "<strong>Gevonden</strong> (manier 1)<br>";
}else if($num>>"1"){
echo "<strong>Meer als één gevonden</strong> (manier 1)<br>
\$foto1: $foto1<br>
\$stamnummer: ";
$i=0;
while ($i < $num) {
$stamnummer=mysql_result($result,$i,$kolom_stamnummer);
echo " - $stamnummer";
$i++;
}
echo "<br>";
}else{
$foto2=substr("$foto",4,5);
dbLogin();
$query="SELECT $kolom_id,$kolom_stamnummer FROM $tabel WHERE $kolom_stamnummer='$foto2'";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
if($num=="1"){
echo "<strong>Gevonden</strong> (manier 2)<br>";
}else if($num>>"1"){
echo "<strong>Meer als één gevonden</strong> (manier 2)<br>
\$foto2: $foto2<br>
\$stamnummer: ";
$i=0;
while ($i < $num) {
$stamnummer=mysql_result($result,$i,$kolom_stamnummer);
echo " - $stamnummer";
$i++;
}
echo "<br>";
}else{
$foto3=substr("$foto",2,5);
dbLogin();
$query="SELECT $kolom_id,$kolom_stamnummer FROM $tabel WHERE $kolom_stamnummer='$foto3-%'";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
if($num=="1"){
echo "<strong>Gevonden</strong> (manier 3)<br>";
}else if($num>>"1"){
echo "<strong>Meer als één gevonden</strong> (manier 3)<br>
\$foto3: $foto3<br>
\$stamnummer: ";
$i=0;
while ($i < $num) {
$stamnummer=mysql_result($result,$i,$kolom_stamnummer);
echo " - $stamnummer";
$i++;
}
echo "<br>";
}else{
echo "Geen foto<br>
$query<br>";
}
}
}
}
closedir($handle);
}
?>
include("config.php");
if ($handle = opendir("$fotos_studenten")){
echo "Logboek:<br>";
while (false!==($foto=readdir($handle))){
$foto1=substr("$foto",0,9);
dbLogin();
$query="SELECT $kolom_id,$kolom_stamnummer FROM $tabel WHERE $kolom_stamnummer='$foto1'";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
if($num=="1"){
echo "<strong>Gevonden</strong> (manier 1)<br>";
}else if($num>>"1"){
echo "<strong>Meer als één gevonden</strong> (manier 1)<br>
\$foto1: $foto1<br>
\$stamnummer: ";
$i=0;
while ($i < $num) {
$stamnummer=mysql_result($result,$i,$kolom_stamnummer);
echo " - $stamnummer";
$i++;
}
echo "<br>";
}else{
$foto2=substr("$foto",4,5);
dbLogin();
$query="SELECT $kolom_id,$kolom_stamnummer FROM $tabel WHERE $kolom_stamnummer='$foto2'";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
if($num=="1"){
echo "<strong>Gevonden</strong> (manier 2)<br>";
}else if($num>>"1"){
echo "<strong>Meer als één gevonden</strong> (manier 2)<br>
\$foto2: $foto2<br>
\$stamnummer: ";
$i=0;
while ($i < $num) {
$stamnummer=mysql_result($result,$i,$kolom_stamnummer);
echo " - $stamnummer";
$i++;
}
echo "<br>";
}else{
$foto3=substr("$foto",2,5);
dbLogin();
$query="SELECT $kolom_id,$kolom_stamnummer FROM $tabel WHERE $kolom_stamnummer='$foto3-%'";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
if($num=="1"){
echo "<strong>Gevonden</strong> (manier 3)<br>";
}else if($num>>"1"){
echo "<strong>Meer als één gevonden</strong> (manier 3)<br>
\$foto3: $foto3<br>
\$stamnummer: ";
$i=0;
while ($i < $num) {
$stamnummer=mysql_result($result,$i,$kolom_stamnummer);
echo " - $stamnummer";
$i++;
}
echo "<br>";
}else{
echo "Geen foto<br>
$query<br>";
}
}
}
}
closedir($handle);
}
?>
Dus zoals gezegd, bij de derde loopt het fout, de substr doet zijn werk goed, het lijkt fout te lopen bij de wildcard in de query...
Gewijzigd op 01/01/1970 01:00:00 door Hans Vereyken
Verder doe je er verstandig aan om je variabelen buiten quotes te halen en je queries netjes uit te schrijven. Dat komt het overzicht wel ten goede:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$query =
"SELECT
".$kolom_id.",
".$kolom_stamnummer."
FROM
".$tabel."
WHERE
".$kolom_stamnummer". = '".$foto1."'
";
?>
$query =
"SELECT
".$kolom_id.",
".$kolom_stamnummer."
FROM
".$tabel."
WHERE
".$kolom_stamnummer". = '".$foto1."'
";
?>
Verder ben ik er ook helemaal geen voorstander van om tabel en kolomnamen in variabelen te zetten. Daar is namelijk helemaal niets variabels aan. Als je je datamodel eenmaal bepaald hebt, ligt dat vast en zal er niet snel meer iets aan veranderen.
Je zorgt er nu alleen maar voor dat je code veel onoverzichtelijker wordt en het debuggen van je queries dus wel eens een ramp zou kunnen worden.
$tabel... En waarom zou een tabel variabel zijn? Dat is zelden een goede aanpak, levert vrijwel altijd problemen op. Zeker in combinatie met variabele kolomnamen. Wil je dat gebruiken, maak dan een functie die voor jou correcte variabele queries aanmaakt, dan bestaat er een kans dat het goed gaat.
Code (php)
1
2
3
4
5
2
3
4
5
Warning: mysql_connect() [function.mysql-connect]: Can't connect to MySQL server on 'localhost' (10048) in J:\webServer\fotoboek_lemmens\config.php on line 11
Warning: mysql_select_db() [function.mysql-select-db]: Can't connect to MySQL server on 'localhost' (10048) in J:\webServer\fotoboek_lemmens\config.php on line 12
Warning: mysql_select_db() [function.mysql-select-db]: A link to the server could not be established in J:\webServer\fotoboek_lemmens\config.php on line 12
Warning: mysql_select_db() [function.mysql-select-db]: Can't connect to MySQL server on 'localhost' (10048) in J:\webServer\fotoboek_lemmens\config.php on line 12
Warning: mysql_select_db() [function.mysql-select-db]: A link to the server could not be established in J:\webServer\fotoboek_lemmens\config.php on line 12
Heeft dit ermee te maken dat hij overbelast is?
Is er een manier om het script te vertragen, want ik vrees dat als ik nu de UPDATE query's erbij doe dat alles in de soep draait.
Ik gebruik voor de tabelnaam en kolomnamen variabelen omdat ik dit volgend jaar nog eens moet doen. Ik heb alle variabelen bepaald in config.php. Vorig jaar heb ik dit ook gedaan, in Acces, toen moest het in boekvorm, vanaf nu in websitevorm. Uit de ervaring van vorig jaar en de vergelijking met de gegevens van dit jaar zie ik dat de gegevens steeds in andere formaten met lichtjes andere namen. Als ik variabelen gebruik moet ik volgend jaar enkel config.php aanpassen, het script voor de fotos draaien en alles staat meteen online.
Probeer eens te achterhalen wat er nu precies fout gaat, duik ook even in de logfiles van de database. Mocht je daar bijkunnen komen.
dit script zal wel lukken, op voorwaarde dat er geen dubbels in de database zitten... en dat is nu net wel het geval. Ik ben nu op zoek naar een om dubbele records samen te voegen, want ze verschillen telkens in één van de gegevens. vb (gegevens zijn aangepast heb een aantal karakters vervangen door x):
Code (php)
1
2
3
4
5
2
3
4
5
naam, voornaam, geboortedatum, adres, stamnummer, email, klasgroep
Vexxxxen, Hans, x7.0x.19xx, Doexxxxdxn x, [email protected], 3I
Vexxxxen, Hans, x7.0x.19xx, Doexxxxdxn x, [email protected], 3I
Vexxxxen, Hans, x7.0x.19xx, Doexxxxdxn x, [email protected], 3I ILO
Vexxxxen, Hans, x7.0x.19xx, , [email protected], 3I ILO
Vexxxxen, Hans, x7.0x.19xx, Doexxxxdxn x, [email protected], 3I
Vexxxxen, Hans, x7.0x.19xx, Doexxxxdxn x, [email protected], 3I
Vexxxxen, Hans, x7.0x.19xx, Doexxxxdxn x, [email protected], 3I ILO
Vexxxxen, Hans, x7.0x.19xx, , [email protected], 3I ILO
Dit zou moeten worden samengevoegd tot:
Het is inderdaad zo dat bij de laatste record de adresgegevens er niet bij zijn. Ik moet dus een script hebben dat kijkt of de stamnummer van twee records hetzelfde is, zoja de gegevens samenvoegen waar nodig. Of is hier geen script nodig en kan dat gebeuren tijdens het uitlezen van de databse?
Gewijzigd op 01/01/1970 01:00:00 door Hans Vereyken