Bladeren door database met SQL leidt tot fout
Hallo allemaal,
Met behulp van deze code probeer ik twee databases bij te werken. Helaas loopt het fout.
Als deze code wordt uitgevoerd ontstaat een Proxyfout.
Ik heb e.e.a. getest en bij het uitvoeren van dit gedeelte gaat het mis.
Ziet er een fout in mijn SQL/PHP?
Ik zie het niet.
George
Met behulp van deze code probeer ik twee databases bij te werken. Helaas loopt het fout.
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
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
$sql = "SELECT * FROM ftphp__fam";
$cResultHuwelijk = mysql_query($sql);
$nAantalHuwelijken = mysql_num_rows($cResultHuwelijk);
// De huwelijksgegevens worden bijgewerkt
if($nAantalHuwelijken != 0) {
while($row = mysql_fetch_array($cResultHuwelijk)) {
// Idnummers ophalen
$cIndiIdMan = $row['husb'];
$cIndiIdMan2 = substr($cIndiIdMan,3,25);
$cIndiIdVrouw = $row['wife'];
$cIndiIdVrouw2 = substr($cIndiIdVrouw,3,25);
// Huwelijksgegevens ophalen
$cIndiHuwSortDatum = "N-" . $row['datec'];
$cIndiHuwDatum = substr($row['datec'],8,2) . "-" . substr($row['datec'],5,2) . "-" . substr($row['datec'],0,4);
$cIndiHuwPlaats = $row['plac'];
// Naam partner ophalen
$sql = "SELECT * FROM ftphp__indi_name WHERE iid = '$cIndiIdVrouw' LIMIT 1";
$cResultVrouw = mysql_query($sql);
$nAantalVrouwen = mysql_num_rows($cResultVrouw);
if($nAantalVrouwen == 0){
$cIndiNaamVrouw = "";
} else {
$row = mysql_fetch_array($cResult);
$cIndiNaamVrouw = $row['givn'] . " " . $row['spfx'] . " " . $row['surn'];
}
$sql = "SELECT * FROM ftphp__indi_name WHERE iid = '$cIndiIdMan' LIMIT 1";
$cResultMannen = mysql_query($sql);
$nAantalMan =mysql_num_rows($cResultMannen);
if($nAantalMan == 0) {
$cIndiNaamMan = "";
} else {
$row = mysql_fetch_array($cResult);
$cIndiNaamMan = $row['givn'] . " " . $row['spfx'] . " " . $row['surn'];
}
$sql1 = "UPDATE ove_genealogie SET tr_sortdatum = '$cIndiHuwSortDatum', tr_plaats = '$cIndiHuwPlaats', relatie_datum = '$cIndiHuwDatum', partner_id = '$cIndiIdVrouw2', partner = '$cIndiNaamVrouw' WHERE iid = '$cIndiIdMan';";
$cResultMan = mysql_query($sql1);
$sql2 = "UPDATE ove_genealogie SET tr_sortdatum = '$cIndiHuwSortDatum', tr_plaats = '$cIndiHuwPlaats', relatie_datum = '$cIndiHuwDatum', partner_id = '$cIndiIdMan2', partner = '$cIndiNaamMan' WHERE iid = '$cIndiIdVrouw';";
$cResultVrouw = mysql_query($sql2);
}
}
$cResultHuwelijk = mysql_query($sql);
$nAantalHuwelijken = mysql_num_rows($cResultHuwelijk);
// De huwelijksgegevens worden bijgewerkt
if($nAantalHuwelijken != 0) {
while($row = mysql_fetch_array($cResultHuwelijk)) {
// Idnummers ophalen
$cIndiIdMan = $row['husb'];
$cIndiIdMan2 = substr($cIndiIdMan,3,25);
$cIndiIdVrouw = $row['wife'];
$cIndiIdVrouw2 = substr($cIndiIdVrouw,3,25);
// Huwelijksgegevens ophalen
$cIndiHuwSortDatum = "N-" . $row['datec'];
$cIndiHuwDatum = substr($row['datec'],8,2) . "-" . substr($row['datec'],5,2) . "-" . substr($row['datec'],0,4);
$cIndiHuwPlaats = $row['plac'];
// Naam partner ophalen
$sql = "SELECT * FROM ftphp__indi_name WHERE iid = '$cIndiIdVrouw' LIMIT 1";
$cResultVrouw = mysql_query($sql);
$nAantalVrouwen = mysql_num_rows($cResultVrouw);
if($nAantalVrouwen == 0){
$cIndiNaamVrouw = "";
} else {
$row = mysql_fetch_array($cResult);
$cIndiNaamVrouw = $row['givn'] . " " . $row['spfx'] . " " . $row['surn'];
}
$sql = "SELECT * FROM ftphp__indi_name WHERE iid = '$cIndiIdMan' LIMIT 1";
$cResultMannen = mysql_query($sql);
$nAantalMan =mysql_num_rows($cResultMannen);
if($nAantalMan == 0) {
$cIndiNaamMan = "";
} else {
$row = mysql_fetch_array($cResult);
$cIndiNaamMan = $row['givn'] . " " . $row['spfx'] . " " . $row['surn'];
}
$sql1 = "UPDATE ove_genealogie SET tr_sortdatum = '$cIndiHuwSortDatum', tr_plaats = '$cIndiHuwPlaats', relatie_datum = '$cIndiHuwDatum', partner_id = '$cIndiIdVrouw2', partner = '$cIndiNaamVrouw' WHERE iid = '$cIndiIdMan';";
$cResultMan = mysql_query($sql1);
$sql2 = "UPDATE ove_genealogie SET tr_sortdatum = '$cIndiHuwSortDatum', tr_plaats = '$cIndiHuwPlaats', relatie_datum = '$cIndiHuwDatum', partner_id = '$cIndiIdMan2', partner = '$cIndiNaamMan' WHERE iid = '$cIndiIdVrouw';";
$cResultVrouw = mysql_query($sql2);
}
}
Als deze code wordt uitgevoerd ontstaat een Proxyfout.
Ik heb e.e.a. getest en bij het uitvoeren van dit gedeelte gaat het mis.
Ziet er een fout in mijn SQL/PHP?
Ik zie het niet.
George
Gewijzigd op 15/11/2012 20:45:34 door George van Baasbank
Zet altijd de error reporting aan.
Dan zie je wat:
Regel 24 en 34: $row = mysql_fetch_array($cResult);
$cResult bestaat niet.
Dan zie je wat:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest van je script
?>
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest van je script
?>
Regel 24 en 34: $row = mysql_fetch_array($cResult);
$cResult bestaat niet.
Ik sluit me aan bij SanThe, daarnaast voer je in een while lus op resultaat van een query nog eens 4 queries uit. Dat betekent als je 1000 rijen uit de eerste query terug krijgt je 4000 queries in één php script.
Hetgeen zal werken, maar wat als je straks 50.000 rijen hebt?:
Fatal error: max execution time exceeded (of zoiets).
Een select query gebaseerd op gegevens uit een andere query kan altijd teruggebracht worden naar een join. (maw 1 query)
De update query kan ik niet plaatsen, als in tabel A iets veranderd en in tabel B moeten daarom ook waarden veranderen, dan zou dat moeten gebeuren op het moment dat die wijziging in tabel A plaats vindt, dmv de logica daarvoor in de app te plaatsen of in de db zelf (bv dmv triggers)
Hetgeen zal werken, maar wat als je straks 50.000 rijen hebt?:
Fatal error: max execution time exceeded (of zoiets).
Een select query gebaseerd op gegevens uit een andere query kan altijd teruggebracht worden naar een join. (maw 1 query)
De update query kan ik niet plaatsen, als in tabel A iets veranderd en in tabel B moeten daarom ook waarden veranderen, dan zou dat moeten gebeuren op het moment dat die wijziging in tabel A plaats vindt, dmv de logica daarvoor in de app te plaatsen of in de db zelf (bv dmv triggers)
Ger,
De update van de tabel ove_genealogie is noodzakelijk omdat in een eerder stadium nieuwe records zijn aangemaakt met behulp van andere brontabellen. De zgn ingewikkelde oplossingen zijn nodig omdat wereldwijd de GEDCOM-bestanden op een bijzondere wijze zijn opgeslagen. Overal staan verwijzingen in naar moedertabellen die zonder deze hulptabellen niet bruikbaar zijn.
De update van de tabel ove_genealogie is noodzakelijk omdat in een eerder stadium nieuwe records zijn aangemaakt met behulp van andere brontabellen. De zgn ingewikkelde oplossingen zijn nodig omdat wereldwijd de GEDCOM-bestanden op een bijzondere wijze zijn opgeslagen. Overal staan verwijzingen in naar moedertabellen die zonder deze hulptabellen niet bruikbaar zijn.
George,
Ik heb net even je topic van 12-11 gelezen, dat had ik nog niet gezien, ik zal daar verder reageren, want anders gaan dingen teveel door elkaar lopen.
Ik heb net even je topic van 12-11 gelezen, dat had ik nog niet gezien, ik zal daar verder reageren, want anders gaan dingen teveel door elkaar lopen.




