Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Cursor-tingest php/mssql

19 views
Skip to first unread message

Leif Neland

unread,
Jun 15, 2012, 7:25:44 AM6/15/12
to
Jeg skal lave dette i php.
Jeg bruger PDO imod mssql.
jeg bruger prepared statements.

For hver linie i en csv-fil:
hent den tilsvarende record i en mssql-tabel.
afhængig af csv-data. ret 0 til n værdier i recorden.
skriv de rettede værdier tilbage
næste linie

Findes der en måde at lave
for hver linie
$record->fetch($linie['id']);
if (..) {$record[felt1]=.$linie[3]};
if (..) {$record[felt2]=.$linie[7]..};
$record->save();
næste linie.

Jeg vil _ikke_ bygge en sql som
for hver linie
$sql="update tabel set ";
if (..) {$sql .=",felt1=".$linie[3];}
if (..) {$sql .=",felt2=".$linie[7];}
$sql .="where id=".$linie['id'];
execute($sql)

Ej heller opdatere et felt ad gangen
$upd1=$dbh->prepare("update tabel set felt1=? where id=?"):
$upd2=$dbh->prepare("update tabel set felt2=? where id=?"):
for hver linie
$record->fetch($linie['id']);
if (..) {$upd1->execute(array($linie[3],$linie['id']};
if (..) {$upd2->execute(array($linie[7],$linie['id']};
næste linie.


Andreas Andersen

unread,
Jun 15, 2012, 7:55:31 AM6/15/12
to
Den 15-06-2012 13:25, Leif Neland skrev:
> Jeg skal lave dette i php.
> Jeg bruger PDO imod mssql.
> jeg bruger prepared statements.
>
> For hver linie i en csv-fil:
> hent den tilsvarende record i en mssql-tabel.
> afhængig af csv-data. ret 0 til n værdier i recorden.
> skriv de rettede værdier tilbage
> næste linie

MSSQL har mulighed for at indlæse en CSV-fil som temporær tabel. Den kan
du så joine med i et enkelt update-statement. Det er muligvis hurtigere.

--
Andreas

Jonathan Stein

unread,
Jun 17, 2012, 8:17:40 AM6/17/12
to
Den 15-06-2012 13:25, Leif Neland skrev:

> For hver linie i en csv-fil:
> hent den tilsvarende record i en mssql-tabel.
> afhængig af csv-data. ret 0 til n værdier i recorden.
> skriv de rettede værdier tilbage
> næste linie

Prøv at google "active record pattern" - desværre er det (vist) ikke
understøttet af PDO (men så vidt jeg kunne se, findes der
PDO-udvidelser, som understøtter det).

Når du hverken vil opdatere ét felt ad gangen eller bygge en SQL-streng
med de specifikke felter, der skal opdateres, kunne løsningen være at
have én SQL-streng, som opdaterer ALLE de mulige felter (og så indsætte
eksisterende værdier for de felter, der skal beholde deres værdi).
Jeg ved dog ikke om det er realistisk i dit tilfælde.

M.v.h.

Jonathan

Martin Larsen

unread,
Jun 28, 2012, 2:59:55 PM6/28/12
to
Leif Neland wrote:

> Findes der en måde at lave
> for hver linie
> $record->fetch($linie['id']);
> if (..) {$record[felt1]=.$linie[3]};
> if (..) {$record[felt2]=.$linie[7]..};
> $record->save();
> næste linie.

Nu skriver du at det skal være op mod mssql, så mit forslag er lettere
offtopic, men Redbean PHP er et meget interessant stykke værktøj som jeg
har stiftet bekendtskab med via et projekt jeg har overtaget.

http://redbeanphp.com/

Redbean virker til mysql, sqlite, postgres og CUBRID.

Et lille eksempel fra manualen som opretter en ny post i tabellen "book":

$book = R::dispense( 'book' );
$book->title = 'Boost development with RedBeanPHP';
$book->author = 'Charles Xavier';
R::store($book);

Mere her: http://redbeanphp.com/manual/create_a_bean


Red Bean er rart at arbejde med fordi det ikke skjuler den underliggende
SQL hvis man ønsker at inddrage dette:

R::getAll( 'select * from page where title = :title',
array(':title'=>'home') );
0 new messages