[PHP]/Mysql: Script pakt niet alle records

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • willem-alex
  • Registratie: December 2001
  • Laatst online: 18-05-2024

willem-alex

you don't wanna know ...

Topicstarter
Ik ben bezig om een tabel te splitsen over meerdere tabellen. Dit gebeurt op basis van postcode. Ik haal uit de bron tabel bijv. eerst alle records met beginnummers 20 wat betreft de postcode. Als ik nu met phpmyadmin in de bron tabel kijk hoeveel records aan dit criterium voldoen gebruik ik deze regel sql code

PHP:
1
2
3
4
SELECT * 
FROM `brontabel` 
WHERE Postcode
LIKE '20%'


Hij vindt dan een flink aantal record (79874 om precies te zijn)

Maar als ik dit nu doorvoer in een script waarin ik meteen al deze records in een ander table insert doet ie dit maar 79290 keer. Ik doe dit met het volgende stukje php code

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$nummers = @mysql_query("SELECT * 
FROM `brontabel` 
WHERE Postcode
LIKE '20%' ");
    if (!$nummers) {
      echo("<p>Error performing query: " . mysql_error() . "</p>");
      exit();
  }      

while ( $row = mysql_fetch_array($nummers) ) {  
$postcode = $row["Postcode"];


$update = "INSERT INTO nieuwe_tabel 
(Postcode) values ('$postcde')";

$result = mysql_query($update);


 }


Hoe kan dit? En wat doe ik eventueel fout?

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Dit is niet leuk voor je db, dit geeft een hele hoge load, probeer eens de volgende opzet:
code:
1
2
3
4
5
6
$sql=insert into tabel() values 
while(){
    $sql.=(waarden)
}
$sql.=
query($sql)


Verder heb je geen error check op je query staan, je ziet dus ook niet wat er fout gaat. Ik bedoel dus mysql_error() gebruiken.

Er zit trouwens een tikfout: $postcode in je query. En is het veld wel Postcode in plaats van postcode, of is mysql case_insensitive? Haal deze verder eens de variablen uit je quotes.
PHP:
1
2
3
4
5
6
7
$update = "INSERT INTO nieuwe_tabel (Postcode) values ";
while ( $row = mysql_fetch_array($nummers) ) {  
    $update.="('".$row['postcode']."')";
}
//debug
echo $update;
$result = mysql_query($update) or die(mysql_error().'<p>'.$update);

[ Voor 138% gewijzigd door djluc op 21-09-2003 17:10 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Output ook eens de MySQL errors van de INSERT query. Ik gok dat je misschien een unique index hebt op die postcode, of dat er een aantal keer een syntax error is door een fout geformuleerde postcode?

Doe ook eens een echo mysql_num_rows ( $nummers ); na de SELECT query. En schrijf een stukje debug code die bij een INSERT error de waarde van $postcode laat zien.

Acties:
  • 0 Henk 'm!

  • willem-alex
  • Registratie: December 2001
  • Laatst online: 18-05-2024

willem-alex

you don't wanna know ...

Topicstarter
volgens mij is mysql case insensitive...anders zouden die 70000 anderen ook niet gepast worden..

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
willem-alex schreef op 21 September 2003 @ 17:10:
volgens mij is mysql case insensitive...anders zouden die 70000 anderen ook niet gepast worden..
Yep, daar heb je inderdaad gelijk in. Heb je mijn code al eens geprobeerd? Je kunt eens proberen te meten wat sneller is, ik denk persoonlijk dat mijn code sneller is namelijk. De code is overigens niet getest ;)

Acties:
  • 0 Henk 'm!

  • willem-alex
  • Registratie: December 2001
  • Laatst online: 18-05-2024

willem-alex

you don't wanna know ...

Topicstarter
Ik heb net je code getest..en het werkt. Gewoon die insert code in een variabele voor het while gebeuren zetten !

Enorm bedankt !

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
willem-alex schreef op 21 September 2003 @ 17:14:
Ik heb net je code getest..en het werkt. Gewoon die insert code in een variabele voor het while gebeuren zetten !
Enorm bedankt !
Graag gedaan, maar heb je nu ook al getest hoeveel tijdsverschil er in zit? Dat lijkt me namelijk wel leuk om te weten.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<? 
    $microtime = microtime(); 
    $split = explode(" ", $microtime); 
    $exact = $split[0]; 
    $secs = date("U"); 
    $bgtm = $exact + $secs; 

/*----------------------------*/
Hier kun je je query plaatsen.
/*----------------------------*/
 
    $microend = microtime(); 
    $split = explode(" ", $microend); 
    $exactend = $split[0]; 
    $secsend = date("U"); 
    $edtm = $exactend + $secsend; 

    $difference = $edtm - $bgtm; 
    $difference = round($difference,5); 
     
    echo "<b>Pagina geladen in ".$difference." seconden</b>"; 
?> 

[ Voor 6% gewijzigd door djluc op 21-09-2003 17:20 ]


Acties:
  • 0 Henk 'm!

  • willem-alex
  • Registratie: December 2001
  • Laatst online: 18-05-2024

willem-alex

you don't wanna know ...

Topicstarter
ik zal ff voor je kijken..geef me 2 minuten

Acties:
  • 0 Henk 'm!

  • willem-alex
  • Registratie: December 2001
  • Laatst online: 18-05-2024

willem-alex

you don't wanna know ...

Topicstarter
Oud script: Pagina geladen in 38.21601 seconden

Nieuw script: Pagina geladen in 39.84074 seconden


Maakt dus niet zoveel uit, behalve dan dat jouw script wel gewoon netjes alle records pakt

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
willem-alex schreef op 21 September 2003 @ 17:31:
Oud script: Pagina geladen in 38.21601 seconden

Nieuw script: Pagina geladen in 39.84074 seconden


Maakt dus niet zoveel uit, behalve dan dat jouw script wel gewoon netjes alle records pakt
Ik heb jowu code nog eens bekeken, maar ik vind het echt vreemd dat jij een insert hebt gehad. Bij jouw script kan er geen data in je db hebben gestaan want je gebruik helemaal de verkeerde variable. Er waren dus wel een aantal rijen maar niet met daarin een postcode.

Ik had eigenlijk wel verwacht dat het sneller zou zijn, 70000x een query uitvoeren vinden de meeste databases niet echt grappig lijkt mij. Er moet dan veel vaker een aanvraag gedaan worden. Het is toch niet zo dat je in het 2de geval beide script hebt ? ;) Jouw script insert overigens wel minder records, dat scheelt ook weer tijd :*)

Volgens mij ben jij trouwens een beetje verkeerd aan het testen want wat betreft het aantal records mag er nooit een verschil zijn tussen beide. Je loopt hetzelfde. Kijk eens met je oude script, alleen dan or die achter je query zetten wat het verschil is.

Uiteraard moet je error_reporting op E_ALL zetten, dan had je ook niet die verkeerde variablenaam gebruikt.

[ Voor 22% gewijzigd door djluc op 21-09-2003 17:54 ]

Pagina: 1