/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
opdatering med mysqli, commands out of syn~
Fra : Leif Neland


Dato : 26-01-11 13:02

Jeg skal opdatere en mysqldatabase med værdier fra en mssql-database.
Metode, pseudo
Foreach(q1=query("SELECT varenr FROM mysql_tabel WHERE pris=0")) {
q2=query("SELECT pris FROM mssql_tabel WHERE varenr=q1['varenr']")
query("UPDATE mysql_tabel SET pris=q2['pris']
WHERE varenr=q1['varenr']")
}

php:

// Forbind til mssql med PDO
$_db_conn = new PDO('dblib:host=x;dbname=x;charset=utf8;' ,
'bruger','password');

// Prepare, bind parametre og resultater
$sql=";
$s_hentpris=$_db_conn->prepare("SELECT pris FROM produkter
   WHERE id=:vareid");
$s_hentpris->bindparam(':vareid',$vareid,PDO::PARAM_INT);
$s_hentpris->bindcolumn('pris',$pris);

// Forbind til mysql med mysqli
$mysqli = new mysqli($db_host, $db_username, $db_password, $db_name);


// prepare mysqli statements
$s_hentvare = $mysqli->stmt_init();
$s_hentvare->prepare("SELECT distinct vareid FROM mytab
   WHERE pris=0");
$s_hentvare->bind_result($vareid);

$s_retpris = $mysqli->stmt_init();
$s_retpris->prepare("UPDATE mytab SET pris=? WHERE vareid=?");
$s_retpris->bind_param("di",$pris,$vareid);

$s_hentvare->execute();
while ($row=$s_hentvare->fetch()) {

   $s_hentpris->execute();
   $s_hentpris->fetch();
   if (!($s_retpris->execute())) {echo $s_retpris->error."<br>";}
// *** Giver fejl: Commands out of sync; you can't run this command now
// ***
};

Kan jeg ikke have alle parametre og resultater 'bind'ede udenfor løkken
lave en løkke over hver hentvare->fetch, med en hentpris->execute og
fetch og en retpris->execute?

Eller er det et problem at retpris vil opdatere samme tabel, som
hentvare har åben?

Leif



 
 
Birger Sørensen (26-01-2011)
Kommentar
Fra : Birger Sørensen


Dato : 26-01-11 13:20

Leif Neland skrev:
> Jeg skal opdatere en mysqldatabase med værdier fra en mssql-database.
> Metode, pseudo
> Foreach(q1=query("SELECT varenr FROM mysql_tabel WHERE pris=0")) {
> q2=query("SELECT pris FROM mssql_tabel WHERE varenr=q1['varenr']")
> query("UPDATE mysql_tabel SET pris=q2['pris']
> WHERE varenr=q1['varenr']")
> }
>
> php:
>
> // Forbind til mssql med PDO
> $_db_conn = new PDO('dblib:host=x;dbname=x;charset=utf8;' ,
> 'bruger','password');
>
> // Prepare, bind parametre og resultater
> $sql=";
> $s_hentpris=$_db_conn->prepare("SELECT pris FROM produkter
>    WHERE id=:vareid");
> $s_hentpris->bindparam(':vareid',$vareid,PDO::PARAM_INT);
> $s_hentpris->bindcolumn('pris',$pris);
>
> // Forbind til mysql med mysqli
> $mysqli = new mysqli($db_host, $db_username, $db_password, $db_name);
>
>
> // prepare mysqli statements
> $s_hentvare = $mysqli->stmt_init();
> $s_hentvare->prepare("SELECT distinct vareid FROM mytab
>    WHERE pris=0");
> $s_hentvare->bind_result($vareid);
>
> $s_retpris = $mysqli->stmt_init();
> $s_retpris->prepare("UPDATE mytab SET pris=? WHERE vareid=?");
> $s_retpris->bind_param("di",$pris,$vareid);
>
> $s_hentvare->execute();
> while ($row=$s_hentvare->fetch()) {
>
>    $s_hentpris->execute();
>    $s_hentpris->fetch();
>    if (!($s_retpris->execute())) {echo $s_retpris->error."<br>";}
> // *** Giver fejl: Commands out of sync; you can't run this command now
> // ***
> };
>
> Kan jeg ikke have alle parametre og resultater 'bind'ede udenfor løkken
> lave en løkke over hver hentvare->fetch, med en hentpris->execute og fetch og
> en retpris->execute?
>
> Eller er det et problem at retpris vil opdatere samme tabel, som hentvare har
> åben?
>
> Leif

Jeg aner intet om PDO...
Men i mysqli skal bind_result() kaldes efter execute(), men før
fetch().
Der er altså ingen variable til resultatet i din kode -> out of sync.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Leif Neland (26-01-2011)
Kommentar
Fra : Leif Neland


Dato : 26-01-11 13:51

Den 26-01-2011 13:19, Birger Sørensen skrev:
> Leif Neland skrev:
>> Jeg skal opdatere en mysqldatabase med værdier fra en mssql-database.
>> Metode, pseudo
>> Foreach(q1=query("SELECT varenr FROM mysql_tabel WHERE pris=0")) {
>> q2=query("SELECT pris FROM mssql_tabel WHERE varenr=q1['varenr']")
>> query("UPDATE mysql_tabel SET pris=q2['pris']
>> WHERE varenr=q1['varenr']")
>> }
>>

> Jeg aner intet om PDO...
> Men i mysqli skal bind_result() kaldes efter execute(), men før fetch().
> Der er altså ingen variable til resultatet i din kode -> out of sync.
>

Nu har jeg pillet noget debug fra, men før den fejlende
$s_retpris->execute(), kan jeg udskrive både vareid fra $s_hentvare og
pris fra $s_hentpris.

Men så fik jeg en anden ide:

$mysqli = new mysqli($db_host, $db_username, $db_password, $db_name);
$mysqli2 = new mysqli($db_host, $db_username, $db_password, $db_name);

$s_hentvare = $mysqli->stmt_init();
$s_retpris = $mysqli2->stmt_init();

Altså hver sin connection til loop og rettelse; det virker.
Der er åbenbart nogle globale variable eller lignende, der gør at man
ikke kan have to objecter stmt_init()'et på den samme connection.

Det virker nu.

Leif

Birger Sørensen (26-01-2011)
Kommentar
Fra : Birger Sørensen


Dato : 26-01-11 16:56

Leif Neland kom med følgende:
> Den 26-01-2011 13:19, Birger Sørensen skrev:
>> Leif Neland skrev:
>>> Jeg skal opdatere en mysqldatabase med værdier fra en mssql-database.
>>> Metode, pseudo
>>> Foreach(q1=query("SELECT varenr FROM mysql_tabel WHERE pris=0")) {
>>> q2=query("SELECT pris FROM mssql_tabel WHERE varenr=q1['varenr']")
>>> query("UPDATE mysql_tabel SET pris=q2['pris']
>>> WHERE varenr=q1['varenr']")
>>> }
>>>
>
>> Jeg aner intet om PDO...
>> Men i mysqli skal bind_result() kaldes efter execute(), men før fetch().
>> Der er altså ingen variable til resultatet i din kode -> out of sync.
>>
>
> Nu har jeg pillet noget debug fra, men før den fejlende
> $s_retpris->execute(), kan jeg udskrive både vareid fra $s_hentvare og pris
> fra $s_hentpris.
>
> Men så fik jeg en anden ide:
>
> $mysqli = new mysqli($db_host, $db_username, $db_password, $db_name);
> $mysqli2 = new mysqli($db_host, $db_username, $db_password, $db_name);
>
> $s_hentvare = $mysqli->stmt_init();
> $s_retpris = $mysqli2->stmt_init();
>
> Altså hver sin connection til loop og rettelse; det virker.
> Der er åbenbart nogle globale variable eller lignende, der gør at man ikke
> kan have to objecter stmt_init()'et på den samme connection.
>
> Det virker nu.
>
> Leif

Jeg er først for nylig begyndt med mysqli (for at få prepared
statements - OOP udgaven, fordi den for mig virker mere overskuelig) -
så jeg skal ikke gøre mig alt for meget klog på det...

Noten på
http://dk2.php.net/manual/en/mysqli-stmt.bind-result.php
siger tydeligt til mig, at bind_result() skal kaldes efter execute(),
men det kan være jeg læser det forkert.
Til gengæld står der her
http://dk2.php.net/manual/en/mysqli-stmt.execute.php
at du kan ikke have to prepared queries i gang på samme tid.

Umiddelbart, ville jeg så læse alle data fra $s_hentvare ind i lokale
variable, og bruge dem i stedet for at have to aktive mysqli statements
samtidig.
Men to forbindelser, kan vel også være en løsning, så længe de ikke
generer hinanden.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste