webForumDet fria alternativet

Uppdatera flera rader?

9 svar · 1 910 visningar · startad av Inferis

InferisMedlem sedan sep. 2000670 inlägg
#1

Hej!
Jag försöker skapa en tidrapport som ska sparas i databas.
Php, mysql används.

Hur löser man detta enklast? Mina försök ser ni nedan.

Jag loopar ut datan så att det blir så här.

<input type="hidden" name="postidet" value="1"><input type="text" name="1timmar">
<input type="hidden" name="postidet" value="2"><input type="text" name="2timmar">
<input type="hidden" name="postidet" value="3"><input type="text" name="3timmar">

Försöker att uppdatera alla rader, men lyckas inte. Provat med följande, men bara sista posten uppdateras.
Sökte och hittade med foreach, men det blev fel.

if (isset($_POST['uppd_tidrapport'])){
//$in_timmar = $_POST["timmar"];
//$in_idet = $_POST["postidet"];
$result=mysqli_query($db,"UPDATE tidrapporter_dagar SET timmar='$in_timmar' WHERE ID='$in_idet'");

  foreach ( $_REQUEST['postidet'] as $id => $details ) { 
   $rid  = addslashes ($id); 
   $in_timmar = addslashes ($details($_REQUEST['postidet'])); 

   $sql  = "UPDATE `tidrapporter_dagar` 
            SET `timmar`='$in_timmar' 
            WHERE `ID`='$rid'"; 
   if ( !$result = mysql_query($sql) ) { 
     die("Det gick inte spara!<br /><b>ID: $rid</b>"); 
   } 
  } 

echo $_POST["timmar"];
echo $_POST["postidet"];
echo "--Postat!";
}
metalboyMedlem sedan jan. 2005953 inlägg
#2

Döp dina input-fält till postidet[] så kommer PHP att behandla dem som en array och du kommer kunna loopa igenom dem med foreach.

<input type="hidden" name="postidet[]" value="1"><input type="text" name="1timmar">
<input type="hidden" name="postidet[]" value="2"><input type="text" name="2timmar">
<input type="hidden" name="postidet[]" value="3"><input type="text" name="3timmar">
prplxrMedlem sedan juni 2012582 inlägg
#3

Lite off-topic kanske, men mysql_-funktionerna kommer inom kort att försvinna från PHP. Dessutom är de förlegade och kan innebära en säkerhetsrisk, särskilt eftersom du här inte har skyddat dig mot SQL injections.

Du bör titta närmare på mysqli_ eller PDO. Personligen föredrar jag PDO.

InferisMedlem sedan sep. 2000670 inlägg
#4

Tack för svar. Ska prova under dagen.
Men hur ska det se ut med mysqli då?

prplxrMedlem sedan juni 2012582 inlägg
#5

mysqli_ fungerar lite annorlunda än mysql_, men är fortfarande proceduralt (men går att köra ojektorienterat om man vill) medan PDO enbart är objektorienterat (om jag inte trasslat till något i huvudet). Båda två har stöd för prepared statements vilket eliminerar risken för SQL injections.

Kika på PHP Docs. Det finns jättebra förklaringar och exempel där.

MySQLi
PDO

InferisMedlem sedan sep. 2000670 inlägg
#6

Nu har jag provat med detta, men det händer ingenting. Här testar jag om det går att ändra datumet den uppdaterades senast.

// Start nya

$link = new mysqli('localhost', 'root', '', 'tider'); 
if ($link->connect_error) die (
	'Connect Error (' . $link->connect_errno . ') ' . $link->connect_error
);

if (
	$_SERVER['REQUEST_METHOD']=="POST" &&
	isset($_POST['submit'])
) {  
	$stmt = $link->prepare('UPDATE tidrapporter_dagar SET uppdaterad = NOW() WHERE id = ? ');
	$stmt->bindParam('i', $_POST['postidet']--);
	$stmt->execute();
}

// Slut nya
prplxrMedlem sedan juni 2012582 inlägg
#7

Blir aldrig din if-sats sann? Alltså, körs aldrig rad 12-14 i koden du visade?

InferisMedlem sedan sep. 2000670 inlägg
#8

prplxr skrev:

Blir aldrig din if-sats sann? Alltså, körs aldrig rad 12-14 i koden du visade?

Jo, det är ju mer kod. Bara jag som slaktar dåligt.
Har gett upp detta. Kör med att man får spara rad för rad istället.

harry_boyMedlem sedan feb. 2003193 inlägg
#9

Fel post

Jester73Medlem sedan mars 2012121 inlägg
#10

Har funnit att PDO har en fördelen att du kan namnge dina params. Så istället för att lägga dem i ordning och ange korrekt datatyp i MySQLI ("ssd", "Daniel", "Olsson","2016-03-11" så kan du i PDO sätta $params[]=:fname=>"Daniel" osv osv i params.

Sen kan skippa att köra en prepare för varje gång du skall lägga in en tidrapport. Det räcker att loopa bindParam (med nya värden för varje loop) och sen execute.

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