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..
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?
$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.
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.
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??
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.
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?
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.
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.
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?
Ä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:
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.
262 ms totalt · 3 externa anrop · v20260731065814-full.c4b5ca48