webForumDet fria alternativet

Problem med fråga

11 svar · 786 visningar · startad av AndreasC

AndreasCMedlem sedan mars 20011 964 inlägg
#1

Har en fråga som jag vill använda för att uppdatera en rad i min mySQL-databas. Frågan ser ut såhär:

       /* Make connection to database */
       mysql_connect(DATABASE_SERVER, DATABASE_USER, DATABASE_PASS) or die(mysql_error());
       mysql_select_db(DATABASE_NAME) or die(mysql_error());

       /**
        * Put posted data in variables
        */
       $customID                = $_POST['customID'];
       $custom_alias            = $_POST['custom_alias'];
       $custom_firstname        = $_POST['custom_firstname'];
       $custom_surname          = $_POST['custom_surname'];
       $custom_co               = $_POST['custom_co'];
       $custom_street           = $_POST['custom_street'];
       $custom_postalcode       = $_POST['custom_postalcode'];
       $custom_cityID           = $_POST['custom_cityID'];
       $custom_privatephone1    = $_POST['custom_privatephone1'];
       $custom_privatephone2    = $_POST['custom_privatephone2'];
       $custom_mobilephone1     = $_POST['custom_mobilephone1'];
       $custom_mobilephone2     = $_POST['custom_mobilephone2'];
       $custom_workphone1       = $_POST['custom_workphone1'];
       $custom_workphone2       = $_POST['custom_workphone2'];
       $custom_email1           = $_POST['custom_email1'];
       $custom_email2           = $_POST['custom_email2'];
       $custom_blocked          = isset($_POST['custom_blocked']) ? 1 : 0;
       $custom_newsletter       = isset($_POST['custom_newsletter']) ? 1 : 0;

       /* Send values to database */
       $insert = "UPDATE ".TBL_CUSTOMERS_TBL."
                  SET alias=$custom_alias,                       first_name=$custom_firstname,             sur_name=$custom_surname,
                      co=$custom_co,                             street=$custom_street,                    postal_code=$custom_postalcode,
                      cityID=$custom_cityID,                     private_phonenr_1=$custom_privatephone1,  private_phonenr_2=$custom_privatephone2,
                      mobile_phonenr_1=$custom_mobilephone1,     mobile_phonenr_2=$custom_mobilephone2,    work_phonenr_1=$custom_workphone1,
                      work_phonenr_2=$custom_workphone2,         e-mail_1=$custom_email1,                  e-mail_2=$custom_email2,
                      Blocked=$custom_blocked,                   Newsletter=$custom_newsletter
                  WHERE customID=$customID";

       mysql_query($insert);

Jag har ett formulär som skickar data till ett php-script med denna fråga men problemet är att frågan inte uppdaterar raderna. Ändringen kommer aldrig in i databasen. Jag har testat att ändra

WHERE customID=$customID";

till

WHERE customID='103'";

för att ändra raden för kund med kundid 103 men det fungerar inte heller.

vad är det för fel på denna fråga?

AndreasCMedlem sedan mars 20011 964 inlägg
#2

Jag tror att jag vet vad felet är nu. Jag hämtar in data i textfälten i formuläret med en annan sql-fråga. Där har jag satt värdet som ska visas i value="" Jag antar att det är det som skickas istället för det uppdaterade värdet.

Några förslag på hur jag kan lösa detta om jag vill kunna hämta in och visa de värden som redan finns i databasen men även kunna ändra dem och skicka de ändrade värdena till databasen?

EDIT: Jag tror nog ändå inte att detta är problemet. Måste nästan vara något fel med frågan i sig?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#3

Urk! Till att börja med har du missat lektion 1 i att undvika SQL-injektioner. Du bör använda funktionen på mysql_real_escape_string på precis varenda en av parametrarna, eller bättre ändå använda PDO och prepared statements.

För det andra så har din kod ett problem om det är så att denna sida exponeras för användarna och att customID ligger i ett hidden-fält. Då kan man ju ändra uppgifterna för alla användare i databasen!

För det tredje bör du köra echo mysql_error(); efter frågan för att se om databasen klagar på något.

För det fjärde heter kund inte custom, utan customer på engelska. Custom är ett adjektiv som betyder anpassad.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#4

Oj nu märkte jag var som var fel också. Du har inga fnuttar runt strängarna i frågan.
alias=¨'$custom_alias' osv ska det vara, inte alias=$custom_alias.

AndreasCMedlem sedan mars 20011 964 inlägg
#5

Jag ändrade till fnuttar men scriptet uppdaterar inte ändå.

Angående SQL injections så är jag medveten om att mina sidor kan vara osäkra. Saken är den att jag håller på att lära mig. Detta är ett privat projekt så därför bryr jag mig inte så mycket ifall det är osäkert. Detta med säkerhet kommer jag att ta mig an längre fram.

Angående punkt 2. Detta är intressant. Hur kan jag göra istället för att skicka customID till sidan som ska visa värdena i text imputs? Jag måste ju på något sätt få sidan att visa uppgifter för rätt person.

Har angett echo mysql_error(); men inget meddelande visas efter att frågan har körts.

Sedan är jag väl medveten om att kund heter customer på engelska ;) Jag är inte helt bombad. Inget illa menat men lite onödigt att märka ord när det inget har med kodens funktion att göra. Hur jag namnger mina variabler är ju lite upp till mig kan man tycka.

AndreasCMedlem sedan mars 20011 964 inlägg
#6

Det märkliga är att om jag skriver ut den resulterande frågan på sidan så ser frågan helt korrekt ut. Dvs, alla data läggs till frågan helt korrekt och customID blir rätt också. Ändå kommer uppgifterna inte in i databasen.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#7

Säkerhet är något du bör lära dig tidigt och som bör influera allt du gör. Säkerhet är mer en metodik och ett medvetande än att pricka av saker på en checklista. Med andra ord, eftersom du fortfarande lär dig är det precis rätt tillfälle att lära dig att skriva säker kod. Inte för att någon skulle attackera din testsida, utan för att lära dig göra rätt.

Ang. punkt 2 så bör du låta användaren logga in med lösenord, hämta ut id't på det viset och spara det i en session på servern. Om du inte använder dig av inloggning för projektet kan du skicka ett slumpmässigt nummer till e-postadressen som kontrolleras för att skapa en temporär session. (Liknande de funktioner som ofta används för att aktivera konton eller när man har glömt ett lösenord.)
Mindre säkert, men bättre än att gå efter id, är att använda e-postadressen som input-parameter. Då kan man visserligen fortfarande ändra någon annans uppgifter, men inte med mindre än att man vet personens e-postadress.

Visas något felmeddelande om från mysql_error() om du lägger till ett uppenbart fel i frågan? Är du 103% säker på att id 103 existerar? Annars kommer frågan att köras utan fel, men utan att något påverkas, eftersom inga rader matchar. Kör echo mysql_affected_rows(); efter frågan för att se hur många rader som påverkades.

Ang. språket så var det en kommentar i all välmening eftersom jag tyckte det verkade konstigt att bara spara två tecken och skriva ett ord med en annan betydelse. Det hade varit en annan sak om du hade förkortat det cust, t ex. Och mitt inlägg innehöll ju mer än att bara anmärka på den saken. Jag hade knappast nämnt det om jag inte redan höll på att skriva ett inlägg.

AndreasCMedlem sedan mars 20011 964 inlägg
#8

Jag måste ha lagt echo mysql_error(); på fel ställe för nu fick jag en felkod vilket jag inte fick förut.

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 '-mail_1='emailadress', e-mail_2='', ' at line 6

Vad är fel där, är det formatet på cellnamnen i databasen? Är det bindestreck PHP inte gillar eller?

Förstår att det var det du tänkte på angående språket. Ville inte låta så grinig i mitt svar men jag tyckte inte att det hade med saken att göra egentligen. Men vad spelar det för roll? Det är inga problem :)

Angående säkerheten har jag skrivit:

       $customerID      = mysql_real_escape_string($_POST['customerID']);
       $customer_alias = mysql_real_escape_string($_POST['customer_alias']);
       etc....

Är det korrekt?

AndreasCMedlem sedan mars 20011 964 inlägg
#9

Problemet löst :) Det var bindestrecket, jag ändrade i koden och i databasen så uppdaterades det rätt.

Finns det något sätt att få koden att stoppa ifall fel hittas. Jag har angett echo mysql_error(); men jag förstår att koden inte kommer att stanna där ifall fel finns eftersom det bara är ett echo. Skulle vara bra att kunna stoppa scriptet, annars syns ju inte felet. Jag har nämligen skrivit att scriptet ska skicka användaren till en annan sida när scriptet körts och då hinner man ju inte se felet.

EDIT: Det var inget. Jag skrev die istället för echo. if(mysql_error()) die(mysql_error()); närmare bestämt.

@ndersMedlem sedan juni 200032 969 inlägg
#10

AndreasC skrev:

Vad är fel där, är det formatet på cellnamnen i databasen? Är det bindestreck PHP inte gillar eller?

PHP struntar i vad dina fältnamn heter - det är ju ett SQL-fel du får. Som du märkte är det bindestrecket, eller rättare sagt minustecknet som det faktiskt är, som är ett problem i sammanhanget. MySQL tolkar din SQL-fråga som någon subtraktion som involverar två fält som heter e och mail_1, och då blir allt himla konstigt.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#11

Snabel-anders, en sak missar du dock. Det går alldeles utmärkt att ha bindestreck och andra tecken i fältnamn om man gör rätt. Man får se till att sätta fältnamnet mellan två grava accenter, vilket är fältnamnens motsvarighet till enkelfnuttar. På svenskt tangentbord får du fram rätt tecken genom att trycka skift och accent-knappen precis till höger om backspace, följt av mellanslag. Alt. skift + ´ två gånger för att skapa två tecken.

`e-mail_1`='$custom_email1' bör alltså t ex funka utmärkt.

@ndersMedlem sedan juni 200032 969 inlägg
#12

nitro2k01 skrev:

Snabel-anders, en sak missar du dock. Det går alldeles utmärkt att ha bindestreck och andra tecken i fältnamn om man gör rätt. Man får se till att sätta fältnamnet mellan två grava accenter, vilket är fältnamnens motsvarighet till enkelfnuttar. På svenskt tangentbord får du fram rätt tecken genom att trycka skift och accent-knappen precis till höger om backspace, följt av mellanslag. Alt. skift + ´ två gånger för att skapa två tecken.

`e-mail_1`='$custom_email1' bör alltså t ex funka utmärkt.

Jag utelämnade det med flit. Backticking är bara fånigt - när man egentligen borde göra rätt istället. Snacka om att SQL-frågorna tar längre tid att skriva när man ska backticka allt...

272 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
130 ms — hämta forumlista (db)
135 ms — hämta statistik (db)
134 ms — hämta tråd, inlägg och bilagor (db)