webForumDet fria alternativet

MySQL/php, Select, mellanslag?

8 svar · 864 visningar · startad av renkott

renkottMedlem sedan maj 20098 inlägg
#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;
?>

drewMedlem sedan mars 2007748 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.

renkottMedlem 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.

nitro2k01Medlem sedan aug. 20037 630 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']);
AndreasCMedlem sedan mars 20011 924 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 ">";

}
?>
AndreasCMedlem sedan mars 20011 924 inlägg
#6

Ingen som vet?

The_HulkMedlem sedan juni 20031 937 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"] . "'>";
PeddaMedlem sedan juni 20004 880 inlägg
#8

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

AndreasCMedlem sedan mars 20011 924 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 :)

Genererad på 377 ms · cache AV · v20260730165559-full.f96bc7eb