Bladeren door database met SQL leidt tot fout
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
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.
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)
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.
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.