Avatar billede bumle90 Nybegynder
01. juli 2004 - 12:04 Der er 20 kommentarer og
1 løsning

simpelt SQL-UPDATE spg

Er det muligt i en update-sætning at sige hvis ikke denne bruger findes skal denne oprettes og der skal lægges de her 3 oplysninger ind til ham.
Ellers skal hans oplysninger blot opdateres.

Eller skal man virklig skrive forskellige adskilte SQL-forespørgsler og checke på recordcount osv?
Avatar billede hmmhelpinghmm Nybegynder
01. juli 2004 - 12:08 #1
Du kan bare lave en mysql_fetch_array der henter oplysninger og så sige
$bruger = $row[bruger]

if ($bruger = $_POST['bruger'] {
echo "brugeren eksistere allerede
}
else {
Her laver du dit insert i databasen !
Avatar billede bumle90 Nybegynder
01. juli 2004 - 12:14 #2
hehe :) Det er jo lige netop det jeg gerne vil undgå
Jeg vil gerne skrive det i en SQL-sætning hvis det er muligt at lave forgreninger i SQL
Avatar billede arne_v Ekspert
01. juli 2004 - 12:14 #3
Lav en INSERT, fejler den p.g.a. duplicate primary key så lav en UPDATE.
Avatar billede arne_v Ekspert
01. juli 2004 - 12:15 #4
[forudsat at du bruger MS SQLServer og ikke MySQL]

Hvis du vil lave det i en operation bliver du nødt til at lave en
stored procedure.
Avatar billede hmmhelpinghmm Nybegynder
01. juli 2004 - 12:15 #5
så skal det jo hedde

// CONNECT
$query = ("SELECT * FROM db");
$row = mysql_query($query);

$bruger = $row[bruger]

if ($bruger = $_POST['bruger'] {
echo "brugeren eksistere allerede";
}
else {
$query2 = mysql_query("INSERT TO db ('bruger', 'pass') VALUES ('$_POST['bruger']', $_POST['pass']')

Eller noget i den retning, tjekker lige de linjer senere, er ikke 100 % sikker på at de er rigtige! Skal kige på anden pc!
Avatar billede hmmhelpinghmm Nybegynder
01. juli 2004 - 12:16 #6
sory, tænkte ikke på at det ikke var mysql!
Avatar billede hmmhelpinghmm Nybegynder
01. juli 2004 - 12:17 #7
du bruger jo  ms sql
Avatar billede -mundi- Nybegynder
01. juli 2004 - 12:18 #8
noget i stil med

if(exists(select * from brugertabel where navn=@navn and andetkriterie=@andetkriterie))
begin
  //update sql
end
else
  //insert sql
begin
end
Avatar billede -mundi- Nybegynder
01. juli 2004 - 12:19 #9
if(exists(select * from brugertabel where navn=@navn and andetkriterie=@andetkriterie))
begin
  //update sql
end
else
begin
  //insert sql
end
Avatar billede arne_v Ekspert
01. juli 2004 - 12:27 #10
Hvis SELECT og enten UPDATE eller INSERT skal virke i en flerbruger
sammenhæng så skal der et rimeligt højt transaction isolation level til.
Avatar billede proaccess Nybegynder
01. juli 2004 - 12:50 #11
Jeg ved ikke om funktionaliteten er "overført" - men I MS Access kan man lave en UPDATE med RIGHT JOIN, som så opdaterer eksisterende poster og tilføjer nye...

UPDATE Distrikter AS D RIGHT JOIN USysTemp_Distrikter AS U ON D.DisID=U.DisID SET D.DisID=U.DisID, D.Distrikt=U.Distrikt, D.Opdateret=Date(), D.Person=U.Person
Avatar billede bumle90 Nybegynder
01. juli 2004 - 13:06 #12
okay, det ser lækkert ud :)
Tak for hjælpen
Avatar billede bumle90 Nybegynder
01. juli 2004 - 13:07 #13
Det kan vidst ikke rigtigt lade sig gøre kan jeg konkludere
Avatar billede bumle90 Nybegynder
01. juli 2004 - 13:21 #14
Men læg svar alle, så deler jeg pointene ud :)
Tak for den hurtige respons
Avatar billede bumle90 Nybegynder
01. juli 2004 - 13:23 #15
Må jeg ikke lige spørge om noget sidste...Det er nok mest dig arne.
Ville lige høre om du kan se hvad jeg gør galt her:
stiId er en char[1000]
ComputerName er i accessbasen en text
Der kommer en addresseringsfejl. Den prøver at addressere 0xffffffff og det sker i denne sætning:
    stat = SQLFetch(stmt);
i while løkken
        SQL=(string)"SELECT ComputerName FROM Computers WHERE ComputerName ='"+CompName+"'";
        stat = SQLExecDirect(stmt,(SQLCHAR *)SQL.c_str(),SQL.length());
          if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
          {printf("Error in stSql %i og %i\n",stat,SQL_INVALID_HANDLE);}
        printf("stat:%i,succes:%i",stat,SQL_SUCCESS);   
        stat = SQLBindCol(stmt,1,SQL_C_CHAR,&stiId,sizeof(stiId),(SQLINTEGER *)SQL_NTS);
        if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) printf("Error in BindCol\n");
        printf("stat:%i",stat);
        while(true)
        {
            printf("sql: %s\n",SQL.c_str());
            stat = SQLFetch(stmt);

            if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) break;
            antalUsr++;
        }
Avatar billede hmmhelpinghmm Nybegynder
01. juli 2004 - 13:25 #16
okay det gør jeg da, selvom det jo ikke var mit svar du ledte efter!
Avatar billede arne_v Ekspert
01. juli 2004 - 13:38 #17
Gæt:

du skal ikke have & foran stiId i BindCol, altså

stat = SQLBindCol(stmt,1,SQL_C_CHAR,stiId,sizeof(stiId),(SQLINTEGER *)SQL_NTS);
Avatar billede arne_v Ekspert
01. juli 2004 - 13:38 #18
og et svar
Avatar billede bumle90 Nybegynder
01. juli 2004 - 13:40 #19
hmmm Det hjalp ikke meget at fjerne &
Avatar billede arne_v Ekspert
01. juli 2004 - 21:34 #20
Det skal nu ikke være der.

Men det sidste argument er også galt.

Du kan ikke bruge SQL_NTS der.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcusing_length_indicator_values.asp

Citat:

SQL_NTS. A string sent to the driver in the corresponding data buffer is null-terminated; this is a convenient way for C programmers to pass strings without having to calculate their byte length. This value is legal only when the application sends data to the driver. When the driver returns data to the application, it always returns the actual byte length of the data.

Så du bliver nødt til at give adressen på en integer.
Avatar billede bumle90 Nybegynder
02. juli 2004 - 09:10 #21
ja oki Det hjalp :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester