更新特定单元格,而其他人应该保持相同

时间:2015-06-07 16:06:46

标签: php mysql database

当我尝试仅更新ISSUED文本框时,我只在已发布的文本框中插入一个数字,同时将其他文本框留空。数据已在DB中成功插入。 “仅发布”文本框包含一个数字,而其他所有文本框都插入为空。

但我希望只有发布的文本框才能在数据库中更新,而其他列和行不应该更改,或者您可以说所有其他列应该与在发布的文本框中输入数字之前相同。

以下是我目前使用的查询..!

$UpdateQuery      = 
"UPDATE books SET Name='$UpdateBookName', 
Auther='$UpdateAutherName', 
Shelf='$UpdateShelf' , 
Quantity='$UpdateQuantity', 
Issued = Issued + '$UpdateIssued', 
Remaining = Quantity - Issued 
WHERE Book_Number= '$Book_Number'";

3 个答案:

答案 0 :(得分:0)

由于您没有在其他文本框中输入任何内容并且仍然在sql update语句中包含这些列,因此它将设置为空值。 查询可以是:

$UpdateQuery = "UPDATE books SET Issued = Issued + '$UpdateIssued' WHERE Book_Number= '$Book_Number'"; 

答案 1 :(得分:0)

这样做的一种方法是检查变量以确定它们是否有任何设置。

如果您只是在先前的查询中抓取它们,那么这些变量可以按原样存在,因此它们会保持更新为现有值,因此它们不会被空值覆盖。

类似的东西:

$current = "select Name, Auther, Shelf, Quantity, Issued, Remaining
from books where WHERE Book_Number= '$Book_Number'";

[检查行,循环等,定义为$row['variablename'] bla bla bla等]

然后将这些与提交语句进行比较,以便您可以执行以下操作:

if (isset($_POST['Name']) {
      $UpdateAutherName = $_POST['Name']; 
}
else {
    $UpdateAutherName = $row['Name'];
}

注意:您的查询容易受到SQL注入攻击。您应该查看mysqli准备好的语句或PDO。这样会更安全,也更容易使用。

以下是mysqli中选择的示例。

$conn = new mysqli($host, $username, $password, $dbname);

if  ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$current = $conn->prepare("select Name, Auther, Shelf, Quantity, Issued, Remaining from books where WHERE Book_Number= ?");
$current->bind_param("i",$Book_Number);
$current->execute();
$current->bind_result($Name, $Auther, $Shelf, $Quantity, $Issued, $Remaining);
$current->fetch();
$current->close();

这样你的变量就已经命名了(“i”表示整数,否则我们用“s”表示字符串)。然后,您可以运行更新,只有在变量存储为POST时才重命名。

这样的事情:

if isset($_POST['UpdateBookName']) {

       $Name = $UpdateBookName;
}

然后运行您的更新,就像原始选择一样:

$UpdateQuery = $conn->prepare("UPDATE books SET Name=?, 
Auther=?, 
Shelf=? , 
Quantity=?, 
Issued = Issued + ?, 
Remaining = Quantity - Issued 
WHERE Book_Number= ?");
$UpdateQuery->bind_param("sssiii", $Name, $Auther, $Shelf, $Quantity, $Issued, $Book_Number);
$UpdateQuery->execute();
$UpdateQuery->close();

答案 2 :(得分:0)

也许这只是一个想法 你有这样的输入



<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<form id="inpuform" name="inputform" action="" method="post">
	book number<input type="text" name="bookno" value="N09A"><br>
	book name<input type="text" name="bookname"><br>
	auther<input type="text" name="auther"><br>
	shelf<input type="text" name="shelf"><br>
	qty<input type="text" name="qty"><br>
	<input type="submit" value="submit">
</form>

<div id="outputmessage"></div>
<script>
var bookno = $('#bookno').text();
$('#inpuform').on('submit', function(e) {
	e.preventDefault();
	$.ajax({
        url: 'proccess.php',
        data: $('#inpuform').serialize(),
        type: 'POST',
        success: function( data ){
        	console.log(data);
			$('#outputmessage').html(data);
		}
	});
}); 
</script>
&#13;
&#13;
&#13;

使用ajax将变量序列化为 proccess.php 然后在php中处理

&#13;
&#13;
<?php
$data = $_POST;
$arrbookno = array_slice($data, 0, 1);
$bookno = $arrbookno['bookno'];
$restdata = array_slice($data, 1);
$arrkey = array();
$arrvalue = array();
$holdvar = "";
foreach ($restdata as $key => $value) {
	if (!empty($value)) {
		array_push($arrkey, $key);
		array_push($arrvalue, $value);
		$holdvar .= $key."='".$value."', ";
	}
}
$cleanvar = rtrim($holdvar, ", ");
$update = "UPDATE books SET ".$cleanvar." WHERE Book_Number=".$bookno;
echo $update;
?>
&#13;
&#13;
&#13;

但是每当你把book no作为第一个输入元素时,这个例子就应该运行了 希望这有帮助...