Just nu i M3-nätverket
Jump to content

Komplicerad ? MySQL-query


Gummikungen

Recommended Posts

Följande skulle jag vilja gör om möjligt..

 

*Plocka ut kolumn b,c,d,e,f,g ur en DB och sortera dessa i fallande ordning vid rad id 01.

 

*lägga in dessa i samma tabell i sorterad ordning i kolumnera 1-6 vid samma id.

 

*loppa så att queryn utförs på samtliga rader i tabellen.

 

 

 

Först och främst.. är detta möjligt? Är det någon som vill hjälpa mig på vägen?

 

Tack

 

 

Link to comment
Share on other sites

Först och främst.. är detta möjligt? Är det någon som vill hjälpa mig på vägen?
Något i den här stilen kanske:

 

$sql = "SELECT b,c,d,e,f,g,id FROM databas";
$query = [color="#ff0000"]mysql_query[/color]($sql);
[color="#0000ff"]while[/color]($res = [color="#ff0000"]mysql_fetch_row[/color]($query)) {
[color="#ff0000"]rsort[/color]($res);
[color="#ff0000"]mysql_query[/color]("UPDATE databas SET b='$res[0]', c='$res[1]', d='$res[2]', e='$res[3]', e='$res[4]', f='$res[5]', g='$res[6]' WHERE id = '$res[7]'");
}

 

Har dock inte testat koden men något ditåt borde fungera.

 

EDIT: Lite fel i koden. ;)

 

.dune.

----------------------------------------------

- "I find this a nice feature but it is not according to the documentation.

Or is it a BUG?"

- "Let´s call it an accidental feature. :-)"

 

[inlägget ändrat 2004-10-26 15:37:47 av dune]

Link to comment
Share on other sites

 

 

sen din sista fråga menar du väl

SET 1='$res[0]'

osv?

 

Hur loopar man igenom alla raderna? Eller gör den detta själv?

 

 

$sql = "SELECT b,c,d,e,f,g,id FROM databas";
$query = [color="#ff0000"]mysql_query[/color]($sql);
[color="#0000ff"]while[/color]($res = [color="#ff0000"]mysql_fetch_row[/color]($query)) {
[color="#ff0000"]rsort[/color]($res);
[color="#ff0000"]mysql_query[/color]("UPDATE databas SET b='$res[0]', c='$res[1]', d='$res[2]', e='$res[3]', e='$res[4]', f='$res[5]', g='$res[6]' WHERE id = '$res[7]'");
}

 

[inlägget ändrat 2004-10-26 16:01:12 av Gummikungen]

Link to comment
Share on other sites

sen din sista fråga menar du välSET 1='$res[0]'
Nej, det menar jag inte. om kolumnerna i tabellen heter b-f så är det kolumnerna jag vill uppdatera med nya värden.

 

Hur loopar man igenom alla raderna? Eller gör den detta själv?

[color="#0000ff"]while[/color]($res = [color="#ff0000"]mysql_fetch_row[/color]($query)) {

There's your loop!

 

 

.dune.

----------------------------------------------

- "I find this a nice feature but it is not according to the documentation.

Or is it a BUG?"

- "Let´s call it an accidental feature. :-)"

 

Link to comment
Share on other sites

ok, jag håller på att testa det nu. Dåligt förklarat av mig men de "nya" kolumnerna heter 1-6.

 

Tack så länge.. återkommer med hur det fungerar.

 

Link to comment
Share on other sites

Dåligt förklarat av mig men de "nya" kolumnerna heter 1-6.
Tror du kommer att få problem om du döper kolumnerna till 1-6 eftersom det kan tolkas fel. Är dock inte säker då jag inte testat... Men springer du på patrull med SQL-satserna så kan det vara fel där.

 

Lycka till!

 

 

.dune.

----------------------------------------------

- "I find this a nice feature but it is not according to the documentation.

Or is it a BUG?"

- "Let´s call it an accidental feature. :-)"

 

Link to comment
Share on other sites

Tack för dina förslag Dune. Tabellen uppdateras inte av någon anledning.

 

Jag döpte om de nya kolumnerna till k till o. Så här ser koden ut just nu.

 

$sql = "SELECT b,c,d,e,f,g,id FROM stallning";
$query = [color="#ff0000"]mysql_query[/color]($sql) [color="#0000ff"]or[/color] [color="#0000ff"]die[/color]("Det gick inte att hämta information från databasen!");
[color="#0000ff"]while[/color]($res = [color="#ff0000"]mysql_fetch_row[/color]($query)) {
[color="#ff0000"]rsort[/color]($res);
[color="#ff0000"]mysql_query[/color]("UPDATE stallning SET k ='$res[0]',  l='$res[1]', m='$res[2]',n='$res[3]', o='$res[4]',p='$res[5]', WHERE id = '$res[6]'");
}

 

Jag får inga felmedelande heller. Du har inga fler ideer väl?

 

Link to comment
Share on other sites

Det är möjligt att det fungerar men jag skulle inte göra min update i en loop där jag itererar över resultatet från en select. Även om det fungerar idag är det jättestor risk att det går sönder den dag mysql får (bättre) cursors.

 

Om du inte kan bryta ut update-satsen från loopandet av resultatrader så gör du nog bäst i att använda två connections till databasen, den ena använder du till selectandet och det andra till din update.

Då skulle det bli nåt i stil med följande:

 

$conn1=[color="#ff0000"]mysql_connect[/color]('localhost', 'user', 'password');
$conn2=[color="#ff0000"]mysql_connect[/color]('localhost', 'user', 'password');
$query = [color="#ff0000"]mysql_query[/color]($sql, $conn1) [color="#0000ff"]or[/color] [color="#0000ff"]die[/color]("Det gick inte att hämta information från databasen!");
[color="#0000ff"]while[/color]($res = [color="#ff0000"]mysql_fetch_row[/color]($query)) {
  [color="#ff0000"]rsort[/color]($res);
  $sql_update="UPDATE stallning SET k ='$res[0]', l='$res[1]', m='$res[2]',n='$res[3]', o='$res[4]',p='$res[5]', WHERE id = '$res[6]'";
  [color="#ff0000"]mysql_query[/color]($sql_update, $conn2);
}

 

Edit:

Jag får inga felmedelande heller. Du har inga fler ideer väl?

Du kollar ju inte om du får några fel.

Lägg till en echo "<H1>".mysql_error()."</H1>"; efter dina anrop till mysql_fetch_row() resp. mysql_query() så lär du märkaom du får fel.

(echo mysql_error($conn1); resp. echo mysql_error($conn2); blir det i mitt exempel).

[inlägget ändrat 2004-10-27 09:48:44 av fhe]

Link to comment
Share on other sites

Tack för ditt förslag... Tabellen "stallning" uppdateras ändå inte.

 

Här är hela min kod:

 

$conn1=[color="#ff0000"]mysql_connect[/color]("", "", "") [color="#0000ff"]or[/color] [color="#0000ff"]die[/color]("Kunde inte skapa koppling!");
$conn2=[color="#ff0000"]mysql_connect[/color]("", "", "") [color="#0000ff"]or[/color] [color="#0000ff"]die[/color]("Kunde inte skapa koppling!");
[color="#ff0000"]mysql_select_db[/color]("") [color="#0000ff"]or[/color] [color="#0000ff"]die[/color]("Kunde inte välja databas");

$sql = "SELECT b,c,d,e,f,g,id FROM stallning";

$query = [color="#ff0000"]mysql_query[/color]($sql, $conn1) [color="#0000ff"]or[/color] [color="#0000ff"]die[/color]("Det gick inte att hämta information från databasen!");

[color="#0000ff"]while[/color]($res = [color="#ff0000"]mysql_fetch_row[/color]($query)) 

{
  [color="#ff0000"]rsort[/color]($res);
  $sql_update="UPDATE stallning SET k ='$res[0]', l='$res[1]', m='$res[2]',n='$res[3]', o='$res[4]',p='$res[5]', WHERE id = '$res[6]'";
  [color="#ff0000"]mysql_query[/color]($sql_update, $conn2);

}

 

Spelar det nåhon roll vad man kallar $res[] ? Kan man tex börja på [1] ? eller är det vedertaget att man börjar med [0] ?

 

Link to comment
Share on other sites

Tabellen "stallning" uppdateras ändå inte.

Du kollar fortfarande inte vad du får för fel.

Ingen här kan gissa, det minsta du kan göra är att skriva ut vad du skickar till databasen, t.ex genom att göra så här:

Ändra:

  $sql_update="UPDATE stallning SET k ='$res[0]', l='$res[1]', m='$res[2]',n='$res[3]', o='$res[4]',p='$res[5]', WHERE id = '$res[6]'";
  [color="#ff0000"]mysql_query[/color]($sql_update, $conn2);

Till:

  $sql_update="UPDATE stallning SET k ='$res[0]', l='$res[1]', m='$res[2]',n='$res[3]', o='$res[4]',p='$res[5]', WHERE id = '$res[6]'";
  [color="#0000ff"]echo[/color] '<h1>'.$sql_update.'</h1>';
  [color="#ff0000"]mysql_query[/color]($sql_update, $conn2);
  [color="#0000ff"]if[/color] ([color="#ff0000"]mysql_errno[/color]()!=0)
    [color="#0000ff"]echo[/color] '<h1>FEL:'.[color="#ff0000"]mysql_error[/color]().'</h1>'

Du gör fel, annars skulle det fungerat. Endast du har möjlighet att felsöka koden. Det gör du förslagsvis genom att skriva ut vad du skickar till databasen och genom att införa grundläggande felhantering (enligt ovan).

 

Spelar det nåhon roll vad man kallar $res[] ? Kan man tex börja på [1] ? eller är det vedertaget att man börjar med [0] ?

Det har inte med vad som är vedertaget eller inte att göra. din variabel $res är en array som du får tillbaka från mysql_fetch_row() som har stoppat in saker på position 0 och framåt.

 

Så här säger manualen:

"The row is returned as an array. Each result column is stored in an array offset, starting at offset 0."

http://se2.php.net/manual/sv/function.mysql-fetch-row.php

 

Den hade kunnat starta på offset 4711 om den velat, men nu börjar den på 0.

 

Link to comment
Share on other sites

while($res = mysql_fetch_row($query))

 

{

rsort($res);

$sql_update="UPDATE stallning SET k ='$res[0]', l='$res[1]', m='$res[2]',n='$res[3]', o='$res[4]',p='$res[5]', WHERE id = '$res[6]'";

mysql_query($sql_update, $conn2);

 

}

Lägg till en mysql_error här också:

[color="#0000ff"]while[/color]($res = [color="#ff0000"]mysql_fetch_row[/color]($query))

{
  [color="#ff0000"]rsort[/color]($res);
  $sql_update="UPDATE stallning SET k ='$res[0]', l='$res[1]', m='$res[2]',n='$res[3]', o='$res[4]',p='$res[5]', WHERE id = '$res[6]'";
  [color="#ff0000"]mysql_query[/color]($sql_update, $conn2) [color="#0000ff"]or[/color] [color="#0000ff"]die[/color]([color="#ff0000"]mysql_error[/color]($conn2);

}

 

Spelar det nåhon roll vad man kallar $res[] ? Kan man tex börja på [1] ? eller är det vedertaget att man börjar med [0] ?
Nej du kan byta namn på $res om du vill.

 

$res är i det här fallet en array, jfr:

$arr = [color="#0000ff"]array[/color]("Noll", "Ett", "Två", "Tre");
[color="#0000ff"]print[/color] $arr[0];

Kommer att ge Noll i output.

 

 

.dune.

----------------------------------------------

- "I find this a nice feature but it is not according to the documentation.

Or is it a BUG?"

- "Let´s call it an accidental feature. :-)"

 

Link to comment
Share on other sites

Följande fel visa vid alla ID:

 

FEL:You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = '1'' at line 1

UPDATE stallning SET k ='6', l='9', m='8',n='8', o='0',p='0', WHERE id = '34'

 

Antar att någom måsvinge är på fel plats?

 

Link to comment
Share on other sites

UPDATE stallning SET k ='6', l='9', m='8',n='8', o='0',p='0', WHERE id = '34'

 

Antar att någom måsvinge är på fel plats?

Finns ingen måsvinge i den SQL-satsen, däremot ett kommatecken framför WHERE.

 

Link to comment
Share on other sites

Finns ingen måsvinge i den SQL-satsen, däremot ett kommatecken framför WHERE.

 

Tack båda två för stor hjälp. Fungerar nu som det ska. :thumbsup:

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...