webForumDet fria alternativet

MySQL/php, Select, mellanslag?

PHP

8 svar · 866 visningar · startad av renkott

Medlem sedan maj 20098 inlägg
Frågan#1

På rad 5 finns $q_sok, om $sok är t.ex Lars funkar allting jättebra. Om $sok därimot är Lars Svensson så funkar inte min whilesats längre ner. Tar jag en echo på $sok så skriver den ut namnet korrekt (både för och efternamn) så felet verkar ligga i $q_sok eller whilesatsen längre ner? Någon som har lust att hjälp mig?

<?php
include_once('anslutning.php');
$query = mysql_query("SELECT * FROM arb_schema ORDER BY vecka");
$namn = mysql_query("SELECT namn FROM arbetare ORDER BY namn");
$sok = $_POST['namn'];
$q_sok = mysql_query("SELECT * FROM arb_schema WHERE arb = '$sok' ORDER BY vecka");
$pris = mysql_query("SELECT namn, norm, over, helg FROM arbetare WHERE namn = '$sok'");

echo ('Välj arbetare: <form action="'.$self.'" method="post"><select name="namn">');

while ($result_row = mysql_fetch_row(($namn))){
echo ('
    <option value="'.$result_row[0].'">'.$result_row[0].'</option>
');
}
echo('
</select><input type="submit" value="Lista arbetare"></form>
');

if ($sok != '') {
echo ('
<table border="1">
<tr><td>Vecka</td><td>Arbetare</td><td>Arbete normtid</td><td>Arb övertid</td><td>Arb Helg</td><td>Blästring</td><td>Bläst övertid</td><td>Bläst Helg</td></tr>
');

while ($result_row = mysql_fetch_row(($q_sok))){
$norm =  $result_row[3]+$result_row[8]+$result_row[13]+$result_row[18
]+$result_row[23];
$over =  $result_row[4]+$result_row[9]+$result_row[14]+$result_row[19
]+$result_row[24];
$blast =  $result_row[5]+$result_row[10]+$result_row[15]+$result_row[2
0]+$result_row[25];
$oblast =  $result_row[6]+$result_row[11]+$result_row[16]+$result_row[2
1]+$result_row[26];
$helg = $result_row[28]+$result_row[31];
$bhelg = $result_row[29]+$result_row[32];

$qn = "SELECT SUM(man+tis+ons+tor+fre) FROM arb_schema WHERE arb='$sok'"; 
$rn = mysql_query($qn) or die(mysql_error());
while($row = mysql_fetch_array($rn)){
$tn = $row[0];
}

$qo = "SELECT SUM(man_over+tis_over+ons_over+tor_over+fre_over) FROM arb_schema WHERE arb='$sok'"; 
$ro = mysql_query($qo) or die(mysql_error());
while($row = mysql_fetch_array($ro)){
$to = $row[0];
}

$qblast = "SELECT SUM(man_blast+tis_blast+ons_blast+tor_blast+fre_blast) FROM arb_schema WHERE arb='$sok'"; 
$rblast = mysql_query($qblast) or die(mysql_error());
while($row = mysql_fetch_array($rblast)){
$tblast = $row[0];
}

$qoblast = "SELECT SUM(man_oblast+tis_oblast+ons_oblast+tor_oblast+fre_oblast) FROM arb_schema WHERE arb='$sok'"; 
$roblast = mysql_query($qoblast) or die(mysql_error());
while($row = mysql_fetch_array($roblast)){
$toblast = $row[0];
}

$qh = "SELECT SUM(lor+son) FROM arb_schema WHERE arb='$sok'"; 
$rh = mysql_query($qh) or die(mysql_error());
while($row = mysql_fetch_array($rh)){
$th = $row[0];
}

$qh_blast = "SELECT SUM(lor_blast+son_blast) FROM arb_schema WHERE arb='$sok'"; 
$rh_blast = mysql_query($qh_blast) or die(mysql_error());
while($row = mysql_fetch_array($rh_blast)){
$th_blast = $row[0];
}

echo ('
<tr>
<td><a href="lank.php?vecka='.$result_row[1].'&arb='.$result_row[2].'">'.$result_row[1].'</a></td>
<td>'.$result_row[2].'</td>
<td>'.$norm.'</td>
<td>'.$over.'</td>
<td>'.$helg.'</td>
<td>'.$blast.'</td>
<td>'.$oblast.'</td>
<td>'.$bhelg.'</td>
</tr>');
}
}

echo ('
<tr><td>Total:</td>
<td></td>
<td>'.$tn.'</td>
<td>'.$to.'</td>
<td>'.$th.'</td>
<td>'.$tblast.'</td>
<td>'.$toblast.'</td>
<td>'.$th_blast.'</td>
</tr>
</table>');

echo $pnorm;
?>

Medlem sedan mars 2007845 inlägg
#2

Du skickar väl inte på allvar in POST direkt in i databasen? Att bara byta namn på variabeln gör det inte ett dugg säkrare.

Har du kollat vad $sok innehåller när du har mellanslag?
Istället för ex $result_row[29] borde du använda namnet på fältet ex $result_row['helger'] då är det lättare för dig att se vad dom olika fälten bör innehålla.

Medlem sedan maj 20098 inlägg
#3

Det är en dropdown där man väljer en person ur en lista. Dvs där finns ingenstans för folk att fylla i information direkt i databasen vid detta tillfället.

$sok skriver ut både för och efternamn i de fall det finns, dvs fungerar.
Jag funderar kring while ($result_row = mysql_fetch_row(($q_sok))) om felet ligger där. Ska jag rama in $q_sok på något sätt där?

Edit: Jätte bra tips i övrigt, tack.

Edit2: Problemet är löst, klantjävel som man är hade jag råkat gör arb i arb_schema tabellen till varchar(11) medans i arbetare var namn varchar(30). Delar av efternamnet klipptes helt enkelt av.

Medlem sedan aug. 20039 340 inlägg
#4

renkott skrev:

Det är en dropdown där man väljer en person ur en lista. Dvs där finns ingenstans för folk att fylla i information direkt i databasen vid detta tillfället.

Spelar ingen som helst roll. Den som är illvillig kan ta sig runt det pissenkelt genom att skapa sitt eget formulär och rensa din databas. Dessutom är det inte bara ett säkerhetsproblem. Anställer du någonsin någon som heter O'Reilly så kommer koden sluta fungera, eftersom MySQL tror att strängen slutar efter O.
Att lämna ett sådant hål öppet är dumt. Särskilt när lösningen är så enkel som att använda mysql_real_escape_string på ett ställe:

$sok = mysql_real_escape_string($_POST['namn']);
Medlem sedan mars 20011 964 inlägg
#5

Har samma problem. Hur kan jag modifiera min kod för att få funktionen att skriva ut allt som står i databasen, istället för att sluta läsa in så fort det kommer ett mellanslag?

<?php
$open = mysql_connect("localhost", "admin", "");
$data = mysql_db_query("kundbas", "SELECT * FROM kunder WHERE user = '{$_SESSION['sess_user']}'");

while ($rad = mysql_fetch_array ($data)) {

print "<input style='border:0; background:transparent' type=text name=name value=";
print $rad["name"];
print ">";
print "<br /><input type=text name=adress value=";
print $rad["adress"];
print ">";
print "<br /><input type=text name=postnr value=";
print $rad["postnr"];
print ">";
print "<br /><input type=text name=postadrs value=";
print $rad["postadrs"];
print ">";
print "<br /><input type=text name=email value=";
print $rad["email"];
print ">";

}
?>
Medlem sedan mars 20011 964 inlägg
#6

Ingen som vet?

Medlem sedan juni 20031 837 inlägg
#7

Vad menar du med att den slutar läsa vid mellanslag?
din HTML-kod ser inte riktigt rätt ut. du ska använda antingen ' eller " runt datan för value.

Exempel:

print "<input style='border:0; background:transparent' type=text name=name value='";
print $rad["name"];
print "'>";

eller

print "<input style='border:0; background:transparent' type=text name=name value='" . $rad["name"] . "'>";
Medlem sedan juni 20006 031 inlägg
#8

Klipps texten av när du lägger in i databasen eller lagras all text som den ska?

Medlem sedan mars 20011 964 inlägg
#9

Jag har ett inloggningsscript med registreringfunktion. När man registrerar sig med det så läggs all information in i databasen. Så all information lagras som den ska. Men när jag hämtar datan med scriptet jag postade här, för att kunna uppdatera datan mot databasen, så hämtas inte datan rätt från databasen. Låt oss säga att det står Malte Larsson i fältet för namn i databasen, när jag då hämtar in det från databasen så står det bara Malte.

Ska testa ditt tips The_Hulk, kan vara en lösning.

EDIT: Det var lösningen på problemet, Tack :)

269 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)