[英]HTML/PHP - Input value taken from a mysql database wont update
因此,基本上我有一個充滿輸入的表,這些輸入都填充有從mysql數據庫獲取的值。 我還使用單選按鈕來選擇其中的一行,然后對其進行編輯,該行應該在數據庫上進行更新,但是它一直使我拋出“默認”值,我的意思是,現有數據不是舊值,而是新的一個。 這是我的整個代碼:
<?php
include 'config.php';
$dbname = "pruebasPHP";
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("Conexión fallida: " . mysqli_connect_error());
}
echo '<html><head><title> Modificar datos Mysql PHP </title>
<style> td, th { padding: 5px; border: 1px solid black;} input {border: 0px;}</style>
<script type="text/javascript">
//<![CDATA[
window.onload = function(){
var cuantos = document.getElementById("valorI").value;
for(var x=0; x<cuantos; x++){
var nx = document.getElementById("n".concat(x));
nx.readOnly = true;
var ax = document.getElementById("a".concat(x));
ax.readOnly = true;
var ex = document.getElementById("e".concat(x));
ex.readOnly = true;
}
}
function escritura() {
var cuantos = document.getElementById("valorI").value;
for(var x=0; x<cuantos; x++){
var radiox = document.getElementById("r".concat(x));
if (radiox.checked) {
document.getElementById("n".concat(x)).readOnly = false;
document.getElementById("a".concat(x)).readOnly = false;
document.getElementById("e".concat(x)).readOnly = false;
}
else {
document.getElementById("n".concat(x)).readOnly = true;
document.getElementById("a".concat(x)).readOnly = true;
document.getElementById("e".concat(x)).readOnly = true;
}
}
}
//]]>
</script>
</head><body><center></br>';
if (isset($_POST['modificar'])) {
if(isset($_POST['radio'])){
$datos = $_POST['radio'];
$datosSeparados = explode(":", $datos);
$sql = 'UPDATE tabla1 SET
firstname="'.$datosSeparados[0].'",
lastname="'.$datosSeparados[1].'",
email="'.$datosSeparados[2].'"
WHERE id='.$datosSeparados[3].';';
echo $sql;
if (mysqli_query($conn, $sql))
echo 'El registro con el ID=<b>' . $datosSeparados[3] . '</b> se ha modificado satisfactoriamente. </br>';
else
echo 'Error. Ha ocurrido un problema tratando de modificar el registro con ID=<b>' . $datosSeparados[3] . '</b>: </br> ' . mysqli_error($conn);
}
}
echo '<form action="" method="post"> Registros a modificar:<br/><table>';
$sql = "SELECT id, firstname, lastname, email from tabla1;";
$resultado = mysqli_query($conn, $sql);
echo '<tr>';
if ($fila = mysqli_fetch_assoc($resultado)){
foreach($fila as $x => $x_value) {
echo '<th>' . $x . '</th>';
}
}
echo '</tr>';
if (mysqli_num_rows($resultado) > 0) {
$i = 0;
while($fila = mysqli_fetch_assoc($resultado)) {
echo '
<tr>
<td> ' . $fila["id"] . '</td>
<td><input type="text" id="n' . $i . '" name="nombre" value="' . $fila["firstname"] . '" /></td>
<td><input type="text" id="a' . $i . '" name="apellidos" value="' . $fila["lastname"] . '" /></td>
<td><input type="text" id="e' . $i . '" name="email" value="' . $fila["email"] . '" /></td>
<td><input type="radio" id="r' . $i . '" name="radio" value="'.$fila["firstname"].':'.$fila["lastname"].':'.$fila["email"].':'.$fila["id"].'" onchange="escritura();" /></td>
</tr>
';
$i++;
}
echo '<input type="hidden" id="valorI" value="'. $i . '"/>';
}
echo '
</table>
<br/>
<input type="submit" name="modificar" value="Modificar">
<input type="reset" value="Limpiar">
</form>';
echo '</center>
</body>
</html>';
?>
關於MVC(模型視圖控制器)的詳細解釋有些冗長,但是您可以在Google上找到大量信息。 簡而言之,它是分層的。 模型(處理數據,數據庫查詢),控制器(邏輯構建視圖所需的數據),視圖(html,css,js)。上面的代碼很難遵循,我相信您將從MVC中受益圖案。
無論如何,要開始分離代碼,您需要開始進行一些整理。 我會將您的初始SQL查詢放在最上面(模仿數據層),然后在下面需要任何邏輯,最后是html。
我將向您展示如何重做您的代碼。 所有這些代碼都放在一個文件中,僅用於演示目的。 最終,您要將其分開在不同的文件中。
這是頁面的頂部,模擬從數據庫到PHP的數據 。 我會將這些數據分配給您的變量$resultado
:
<?php
$resultado = array(
array(
"id" => 1,
"firstname" => "John",
"lastname" => "Doe",
"email" => "j@d.com"
),
array(
"id" => 2,
"firstname" => "Jane",
"lastname" => "Johnson",
"email" => "ja@d.com"
),
array(
"id" => 3,
"firstname" => "Tom",
"lastname" => "Brady",
"email" => "b@d.com"
)
);
?>
然后,由於沒有太多邏輯發生,因此我將輸出“視圖”或HTML。 在這里,您會注意到我創建了一個不同的功能來“鎖定”所有輸入,另一個功能將傳遞當前的廣播並“解鎖”這些輸入。 請注意,所有嵌入式PHP都被HTML內的那些PHP標簽所包圍。 :
<html>
<head>
<script type="text/javascript">
window.onload = function () {
lock_inputs();
};
function lock_inputs() {
var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++) {
if (inputs[i].type === "text") {
inputs[i].readOnly = true;
}
}
}
function escritura(radio, i) {
lock_inputs();
if (radio.checked) {
document.getElementById("n".concat(i)).readOnly = false;
document.getElementById("a".concat(i)).readOnly = false;
document.getElementById("e".concat(i)).readOnly = false;
}
}
</script>
</head>
<body>
<form action="" method="post">
Registros a modificar:<br/>
<table>
<?php
$i = 0;
foreach ($resultado as $fila) {
?>
<tr>
<td><?php echo $fila["id"] ?></td>
<td>
<input type="text" id="n<?php echo $i ?>" name="nombre" value="<?php echo $fila["firstname"] ?>"/>
</td>
<td>
<input type="text" id="a<?php echo $i ?>" name="apellidos" value="<?php echo $fila["lastname"] ?>"/>
</td>
<td>
<input type="text" id="e<?php echo $i ?>" name="email" value="<?php echo $fila["email"] ?>"/>
</td>
<td>
<input type="radio" id="r<?php echo $i ?>" name="radio" value="<?php echo $fila["firstname"] . ':' . $fila["lastname"] . ':' . $fila["email"] . ':' . $fila["id"] ?>" onchange="escritura(this,<?php echo $i ?>);"/>
</td>
</tr>
<?php
$i++;
}
?>
</table>
</form>
</body>
</html>
希望您現在可以更好地理解此代碼。 我確實刪除了許多其他代碼,以便您可以了解並理解分離的重要性。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.