webForumDet fria alternativet

Konvertering från string till int strular.

23 svar · 1 305 visningar · startad av elky

elkyMedlem sedan feb. 201320 inlägg
#1

Hej!

Jag försöker konvertera en sträng till en int, dock strular både (int)$strangen och intval($strangen).

Strängen jag har kommer är siffrorna 3 och 299 ifrån en CSV-fil som ser ut som följer:

"en sak", "en sak till", "3", "128 30", "299".

Innan omvandlingen tar jag bort "-tecknen med funktionen:

$data[0] = str_replace('"', '', $data[0]);

Om jag struntar i att typomvandla variabeln och skickar den till en databas med varchar i fältet hamnar värdet, ex 299, där utan problem, men typomvandlar jag till int via funktionerna int och intval och sedan istället skickar värdet till ett fält med int som variabeltyp i mysql hamnar inte 299 i fältet, utan en nolla..

kortfattat blir resultaten:
strängen 299 - > mysql(sträng) = 299
(int)strängen 299 - > mysql(sträng) = 0
intval(strängen 299) - > mysql(sträng) = 0

Hoppas att ni förstår hur jag menar.

Hur kan jag få värdet att behållas efter typomvandlingen?

Mvh Erik

greyhoundMedlem sedan maj 20031 472 inlägg
#2

Vad händer om du bara testat att köra en "var_dump($data[0]);" säger den att den är en int efter omvandligen eller ej?

metalboyMedlem sedan jan. 2005953 inlägg
#3

Visa hur din kod ser ut, så blir det lättare att hjälpa.

elkyMedlem sedan feb. 201320 inlägg
#4

Såhär ser själva koden ut, när jag bara lägger in infon som strängar.. har ändrat fram och tillbaka - bytt ut addslashes mot olika varianter att omvandla till int, se ovan.. men samma resultat, 0 hamnar som resultat i databasen (observera att jag vid dessa försök har ändrat till int i databasen också, så där ligger ej felet)

Koden:

<?php

//anslut till databasen
$connect = mysql_connect("localhost","mindatabas","mittlösen");
mysql_select_db("elky_se",$connect);

if ($_FILES[csv][size] > 0) {
    //get the csv file
    $file = $_FILES[csv][tmp_name];
    $handle = fopen($file,"r");
    $row = 1;
    //loopa igenom CSV-filen och skriv till databasen
    while ($data = fgetcsv($handle,1000,",","'")){
        //hoppa ur loopen första varvet för att ignorera headern (kolumn-överskrifterna)
        if($row == 1){ $row++; continue; }
        if ($data[0]) {

           //ta bort specialtecket " från de utvalda segmenten nedan
           $data[0] = str_replace('"', '', $data[0]);
           $data[1] = str_replace('"', '', $data[1]);
           $data[2] = str_replace('"', '', $data[2]);
           $data[3] = str_replace('"', '', $data[3]);
           $data[4] = str_replace('"', '', $data[4]);

        //skriv till databasen
		mysql_query("INSERT INTO o_rader
		(
		    namn,
		    adress
		    antal,
		    pris,
		    kommentar

		    ) VALUES (

                    '".addslashes($data[0])."',
                    '".addslashes($data[1])."',
                    '".addslashes($data[2])."',
                    '".addslashes($data[3])."',
                    '".addslashes($data[4])."'
                )
            ");
        }
    }
    //redirect
    header('Location: import.php?success=1'); die;
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Ladda upp CSV-fil</title>
</head>

<body>

<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
  Välj CSV-fil att ladda upp: <br />
  <input name="csv" type="file" id="csv" />
  <input type="submit" name="Submit" value="Ladda upp" />
</form>

</body>
</html>

Hur skall jag få exempelvis 299 som ligger i $data[3] att hamna i databasen som en int, har ju provat och misslyckats med både intval() och (int). Jag kanske lägger in funktionen på fel ställ?

@ndersMedlem sedan juni 200032 969 inlägg
#5

$data[3] måste ju egentligen inte vara en int - du lägger ju in den i strängen som är din SQL-fråga - så då blir den i alla fall en sträng igen. Men det kan vara bra av sql injection-skäl att typkonvertera ändå.

Så: ändra datatyp i databasen, typkonvertera till int, och undvik apostrofer runt int-värdet i frågan. addslashes ska du inte behöva köra på ett tal.

		mysql_query("INSERT INTO o_rader
		(
		    namn,
		    adress
		    antal,
		    pris,
		    kommentar

		    ) VALUES (

                    '".addslashes($data[0])."',
                    '".addslashes($data[1])."',
                    ".$data[2].",
                    ".$data[3].",
                    '".addslashes($data[4])."'
                )
            ");

Dessutom: om du upplever att du får fel värden i databasen, gör testutskrifter i din kod med echo - både på enskilda värden och på SQL-frågan. Då behöver du inte gissa lika mycket.

mvh

elkyMedlem sedan feb. 201320 inlägg
#6

Jag har kört exakt den koden också, och skriver jag ut data3 får jag ut 299 på skärmen som det är tänkt, men ändå hamnar 0 i databasen...detta trots att jag har int som datatyp i databasen. Hur är detta möjligt??

@ndersMedlem sedan juni 200032 969 inlägg
#7

Skriv ut SQL-frågan med echo också. Ser den rätt ut - kör den i ex. phpMyAdmin och se om det händer något annorlunda.

mvh

elkyMedlem sedan feb. 201320 inlägg
#8

När jag kör den i phpmyadmin så hamnar siffrorna rätt i tabellen. men någonstans på vägen blir värdena 0. Jag är verkligen helt rådlös just nu.

elkyMedlem sedan feb. 201320 inlägg
#9

Okej såhär blir utfallet när jag skriver ut sqlfrågan i klartext i phpn:

INSERT INTO o_rader (namn, adress, antal, pris, kommentar) VALUES ('\0\0S\0o\0f\0i\0a\0 \0J\0o\0n\0s\0s\0o\0n\0\0', '\0\0 \0A\0n\0n\0a\0 \0H\0e\0m\0b\0e\0r\0g\0 \0H\0e\0r\0m\0a\0n\0s\0s\0o\0n\0\0', '299', '2', '\0\0\0' )

Ändå blir det fel när 299 och 2 skall in i sina resp int-fält i databasen.

Några ideer?

@ndersMedlem sedan juni 200032 969 inlägg
#10

Vet inte om det spelar roll i MySQL - men man "ska" inte ha apostrofer runt talvärden. Ta bort och prova igen.

@ndersMedlem sedan juni 200032 969 inlägg
#11

addslashes verkar göra konstiga saker med din text f.ö. Jag kan för lite om php - så vad är ditt syfte med att använda den funktionen?

mvh

elkyMedlem sedan feb. 201320 inlägg
#12

Ja det har du rätt i, tog bort dessa helt nu, men fortfarande kommer inte siffrorna in i databasen korrekt.. all data utom dem som skall hamna i databasen som intar blir rätt. Hur kan värdena bli 0, jag förstår ingenting.

@ndersMedlem sedan juni 200032 969 inlägg
#13

Det råkar inte vara så att du valt tinyint som typ? I så fall är 299 för stort.

elkyMedlem sedan feb. 201320 inlägg
#14

Nejdå, har gjort om funktionen nu och tänkte lämna uträkningen till phpn att lösa istället.. Tänkte göra beräkningen via mysql_fetch_array'en när den skriver ut mina orderrader.

siffrorna, exempelvis 299 och 2 skrivs ut korrekt, men så fort jag kör (int) eller intval() på min sträng innehållandes texten 299 blir resultatet 0, har jag missat något?

metalboyMedlem sedan jan. 2005953 inlägg
#15

Jag är fortfarande intresserad av att se den kod du har testat med intval() respektive (int) som inte fungerar för dig. Det är ju hyfsat svårt att säga om du har missat något när du inte visar hur du har försökt.

elkyMedlem sedan feb. 201320 inlägg
#16

Okej det sista försöket att räkna ihop antalet via php-koden var detta. Jag gar räknaren värdet 0 innan sql-frågan.

$pris+=(int)$row["pris"];

Jag blir verkligen inte klok på varför den gör om "299" till 0 vid typomvandlingen. Jag har även dubbelkollat i databasen - det står 299 i klartext där. Den skriver även ut 299 om jag bara echo'ar ut värdet utan någon typomvandling. Har även provat att köra beräkningen utan någon typomvandling, samma resultat där: 0.

elkyMedlem sedan feb. 201320 inlägg
#17

Det verkar som att det är databasen som strular till det. för när jag testar olika select-satser med LIKE kan den bara hitta värden från de fält jag själv har skapat manuellt, ej de som CSV-filen automatiskt läser in. Någon som har någon ide?

elkyMedlem sedan feb. 201320 inlägg
#18

Äntligen har jag lokaliserat felet. Allting berodde på character encodingen. Allt såg rätt ut i phpmyadmin tills jag gick in via fliken copy, och såg att det i alla de krånglande fälten stod en massa � mellan varje bokstav. I php har jag satt encodingen via:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

och i fältet i mysql är encodingen latin1_swedish_ci.

Hur kan jag åtgärda detta?

onkelborgMedlem sedan juli 2003555 inlägg
#19

Kör utf-8 rakt av så slipper du problem

nitro2k01Medlem sedan aug. 20039 342 inlägg
#20

@nders skrev:

Så: ändra datatyp i databasen, typkonvertera till int, och undvik apostrofer runt int-värdet i frågan. addslashes ska du inte behöva köra på ett tal.

Det finns olika skolor kring detta. Vissa menar att man alltid ska köra fnuttar runtom samt addslashes, även för tal, för att göra likadant överallt för inte riskera att göra fel, samt för att att skydda mot eventuella tillfällen när en typkonvertering glöms.

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