我有这样的疑问:
$sql = "UPDATE test_accs SET
acc_owner = '$owner_id',
acc_policy_version = '$version',
acc_policy_last_update = '$approved',
acc_policy_next_update = '$renewed'
WHERE acc_id = '1'";
现在,web folmular上的所有这些值都是可选的,可以设置其中一个值,两个左右。现在,在我提交表单后,它会进入查询:
UPDATE test_accs SET acc_owner = '2', acc_policy_version = '1.2', acc_policy_last_update = '2012-12-19', acc_policy_next_update = '2012-12-18' WHERE acc_id = '1'
仅当我从表单提交所有值时才有效。你能否告诉我,即使没有发送所有的价值,它是如何运作的,例如其中一个?
当我设置一个值(f.ex。策略版本)时,它看起来像是:
UPDATE test_accs SET acc_owner = '', acc_policy_version = '1.2', acc_policy_last_update = '', acc_policy_next_update = '' WHERE acc_id = '1'
它无效。
可能是acc_owner表值的原因?
#1366 - Incorrect integer value: '' for column 'acc_owner' at row 1
感谢您的建议。
形式:
echo '<td>Change owner: <select name="owner_id" onchange="showUser(this.value)" style="font-size:9px"><option value="">Select a person:</option>';
while($owners = mysql_fetch_array($owners_query)) { echo '<option value="'.$owners['id'].'">'.$owners['surname'].' '.$owners['name'].'</option></h2>'; } echo '</select></td>';
echo "<td><input name='version' style='width:50px;text-align:center' placeholder='0.0' /></td>";
echo "<td><input name='approved' class='datepicker_all' readonly='readonly' style='text-align:center' placeholder='1999-01-01' /></td>";
echo "<td><input name='renewed' class='datepicker_all' readonly='readonly' style='text-align:center' placeholder='1999-01-01' /></td>";
答案 0 :(得分:4)
实现此目的的一种方法是在SQL语句中使用一个表达式来测试提供的值是否为空字符串。如果提供的值是空字符串,则使用列的当前值作为要分配给列的值。否则,将提供的值分配给列。
在下面的示例中,每个提供的值必须在语句中包含TWICE:一次在条件测试中,然后再次,作为条件测试的可能结果。
本声明:
UPDATE test_accs
SET acc_owner = IF('2'='',acc_owner,'2')
, acc_policy_version = IF('1.2'='',acc_policy_version,'1.2')
, acc_policy_last_update = IF('2012-12-19'='',acc_policy_last_update,'2012-12-19')
, acc_policy_next_update = IF('2012-12-18'='',acc_policy_next_update,'2012-12-18')
WHERE acc_id = '1'
等同于问题中的第一个UPDATE语句,因为它将所有四列的值设置为新的指定值。
本声明:
UPDATE test_accs
SET acc_owner = IF(''='',acc_owner,'')
, acc_policy_version = IF('1.2'='',acc_policy_version,'1.2')
, acc_policy_last_update = IF(''='',acc_policy_last_update,'')
, acc_policy_next_update = IF(''='',acc_policy_next_update,'')
WHERE acc_id = '1'
仅更改acc_policy_version
列的值,其他三列的值将保持不变。
这不一定是最好的方法,但在某些情况下它是可行的。
也可以创建一个表达式,要求在语句中指定每个提供的值一次,尽管我认为这些表达式不太直观:
SET acc_owner = COALESCE(NULLIF( '' ,''),acc_owner )
, acc_policy_version = COALESCE(NULLIF( '1.2' ,''),acc_policy_version)
这基本上与上面的例子做同样的事情。
如果提供的值等于&#39;&#39; (就像上面示例中的acc_owner
一样),然后NULLIF表达式将返回NULL。 COALESCE函数实质上导致跳过NULL值,并且列的当前值将保持不变(列的当前值被分配给列。)
如果提供的值不等于&#39;&#39; (就像上面示例中的acc_policy_version
一样),然后NULLIF表达式将返回提供的值。 COALESCE函数将获取该值,并将其分配给列。
答案 1 :(得分:1)
检查acc_owner
是否为空并将其设置为零是一个选项,如果列应该保持整数,则不能插入空格 - 或者除非你有int值否则不要更新
1:
if(strlen($acc_owner)==0){
$acc_owner=0;
}
2:
if(is_int($acc_owner)){
//update it
}
答案 2 :(得分:1)
是否需要整数字段的值?如果没有,则检查是否设置了GET / POST值,如果为空,则不要在更新语句中包含该值。
if(isset($_GET['acc_id'])) {
$acc_id = $_GET['acc_id'];
$sql = "UPDATE test_accs SET ";
if(isset($_GET['version'])) {
$version = $_GET['version'];
$sql = $sql . "acc_policy_version = " . $version . ",";
}
if(isset($_GET['owner_id'])) {
$owner_id = $_GET['owner_id'];
$sql = $sql . "acc_owner = " . $owner_id . ",";
}
$sql = $sql .
"acc_policy_last_update = '$approved',
acc_policy_next_update = '$renewed'
WHERE acc_id = " . $acc_id;
//Execute SQL
echo "successfully updated " . $acc_id;
} else {
echo "invalid acc_id";
}
答案 3 :(得分:0)
您应该验证来自html表单的所有值。比如,如果你的mysql字段可以为NULL,只需将NULL设置为php var:
if (strlen($owner_id) == 0) {
$owner_id = NULL;
// OR
$owner_id = 0;
} else {
$owner_id = addslashes($owner_id);
}
$sql = "UPDATE test_accs SET
acc_owner = '$owner_id',
acc_policy_version = '$version',
acc_policy_last_update = '$approved',
acc_policy_next_update = '$renewed'
WHERE acc_id = '1'";
答案 4 :(得分:0)
1 - 将$ owner_id转换为int
$owner_id = (int)$owner_id;
2 - 仅当值> gt时,才使用条件更新此字段0
$sql = "UPDATE test_accs SET " .
($owner_id > 0 ? "acc_owner = '$owner_id', " : "") .
"acc_policy_version = '$version', " .
"acc_policy_last_update = '$approved', " .
"acc_policy_next_update = '$renewed' " .
"WHERE acc_id = '1'";
注意:要充实,您的变量似乎没有正确发布,并且您存在mysql注入的风险。请参阅http://php.net/manual/fr/mysqli.real-escape-string.php。
并且,也许你应该考虑使用PDO php扩展(http://fr2.php.net/manual/en/intro.pdo.php)为你的mysql developpement或任何orm?
答案 5 :(得分:0)
您可以根据各自的数据类型,使用默认值初始化包含可选字段值的变量。
请参阅下面提到的代码段。
$owner_id=0;
$version=0;
$approved='';
$renewed='';
if($_SERVER['REQUEST_METHOD']=='POST')
{
extract($_POST);
}
$sql = "UPDATE test_accs SET
acc_owner = '$owner_id',
acc_policy_version = '$version',
acc_policy_last_update = '$approved',
acc_policy_next_update = '$renewed'
WHERE acc_id = '1'";