Php 复选框中的任意值导致难以在PDO上执行SQL语句
先生们!我有一个用PDO处理多行更新的php脚本。 如果勾选,我想添加一个复选框,从现在起30天内按时间戳更新我的数据库特定列 问题是ofc,当它没有被勾选时,不会有值发送到它的键,所以我会得到:它返回这个错误 未捕获异常“PDOException”,消息为SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解要使用的正确语法 因此,我请求帮助,如果有转机,这里是我的PHP代码:Php 复选框中的任意值导致难以在PDO上执行SQL语句,php,mysql,checkbox,pdo,Php,Mysql,Checkbox,Pdo,先生们!我有一个用PDO处理多行更新的php脚本。 如果勾选,我想添加一个复选框,从现在起30天内按时间戳更新我的数据库特定列 问题是ofc,当它没有被勾选时,不会有值发送到它的键,所以我会得到:它返回这个错误 未捕获异常“PDOException”,消息为SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解要使用的正确语法 因此,我请求帮助,如果有转机,这里是我的PHP代码: if (isset($_POST['sub
if (isset($_POST['submit'])) {
$stmt = $db->prepare("UPDATE `$tbl_name` SET `ssl`=:ssl, `exp`=:exp, `country`=:country, WHERE id=:id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':ssl', $ssl, PDO::PARAM_STR);
$stmt->bindParam(':exp', $exp, PDO::PARAM_STR);
$stmt->bindParam(':country', $country, PDO::PARAM_STR);
foreach ($_POST['ssl'] as $id => $ssl) {
if(isset($_POST['thirtydays'][$id])){
$exp = $_POST['thirtydays'][$id];
}
$country = $_POST['country'][$id];
$stmt->execute();
}
echo '<h1>Updated the records.</h1>';
}
if(isset($\u POST['submit'])){
$stmt=$db->prepare(“更新`$tbl_name`SET`ssl`=:ssl,`exp`=:exp,`country`=:country,其中id=:id”);
$stmt->bindParam(':id',$id,PDO::PARAM_INT);
$stmt->bindParam(':ssl',$ssl,PDO::PARAM_STR);
$stmt->bindParam(':exp',$exp,PDO::PARAM_STR);
$stmt->bindParam(':country',$country,PDO::PARAM_STR);
foreach($\u POST['ssl']作为$id=>$ssl){
如果(isset($_POST['thirtyday'][$id]){
$exp=$_POST['thirtydays'][$id];
}
$country=$_POST['country'][$id];
$stmt->execute();
}
echo“更新了记录”;
}
exp是时间戳列。以下是作为HTML的复选框:
<input type="checkbox" name="thirtydays[80]" value="2014-02-04 04:04:53">
<input type="text" name="country[80]" value="DE" />
<input type="text" name="ssl[80]" value="false"/>
注意结构:thirtydays[$id]
,值中的时间戳由date(“Y-m-d H:i:s”,strotime(+30天))生成。
希望有人能帮助我。提前感谢并提供更多功能。$exp=''$国家=''$ssl='';
$exp=''; $country=''; $ssl='';
if (isset($_POST['submit'])) {
$stmt = $db->prepare("UPDATE `$tbl_name` SET `ssl`=:ssl, `exp`=:exp, `country`=:country WHERE id=:id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':ssl', $ssl, PDO::PARAM_STR);
$stmt->bindParam(':exp', $exp, PDO::PARAM_STR);
$stmt->bindParam(':country', $country, PDO::PARAM_STR);
foreach ($_POST['ssl'] as $id => $ssl) {
if(isset($_POST['thirtydays'][$id])){ $exp = $_POST['thirtydays'][$id]; }
$country = $_POST['country'][$id];
$stmt->execute();
}
echo '<h1>Updated the records.</h1>';
如果(isset($_POST['submit'])){
$stmt=$db->prepare(“更新`$tbl_name`SET`ssl`=:ssl,`exp`=:exp,`country`=:country WHERE id=:id”);
$stmt->bindParam(':id',$id,PDO::PARAM_INT);
$stmt->bindParam(':ssl',$ssl,PDO::PARAM_STR);
$stmt->bindParam(':exp',$exp,PDO::PARAM_STR);
$stmt->bindParam(':country',$country,PDO::PARAM_STR);
foreach($\u POST['ssl']作为$id=>$ssl){
如果(设置($_POST['thirtydays'][$id]){$exp=$_POST['thirtydays'][$id];}
$country=$_POST['country'][$id];
$stmt->execute();
}
echo“更新了记录”;
查询仅在选中复选框后执行,因为if(isset($\u POST['thirtyday'][$id])
此外,在将
$exp
变量绑定到语句后,还可以设置该变量。
这同样适用于$country
变量
if (isset($_POST['submit'])) {
$stmt = $db->prepare("UPDATE `$tbl_name` SET `ssl`=:ssl, `exp`=:exp, `country`=:country WHERE id=:id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':ssl', $ssl, PDO::PARAM_STR);
foreach ($_POST['ssl'] as $id => $ssl) {
if(isset($_POST['thirtydays'][$id])){
$exp = $_POST['thirtydays'][$id];
} else {
$exp = '';
}
$country = $_POST['country'][$id];
$stmt->bindParam(':exp', $exp, PDO::PARAM_STR);
$stmt->bindParam(':country', $country, PDO::PARAM_STR);
$stmt->execute();
}
echo '<h1>Updated the records.</h1>'; }
if(isset($_POST['submit']){
$stmt=$db->prepare(“更新`$tbl_name`SET`ssl`=:ssl,`exp`=:exp,`country`=:country WHERE id=:id”);
$stmt->bindParam(':id',$id,PDO::PARAM_INT);
$stmt->bindParam(':ssl',$ssl,PDO::PARAM_STR);
foreach($_POST['ssl']作为$id=>$ssl){
如果(isset($_POST['thirtyday'][$id]){
$exp=$_POST['thirtydays'][$id];
}否则{
$exp='';
}
$country=$_POST['country'][$id];
$stmt->bindParam(':exp',$exp,PDO::PARAM_STR);
$stmt->bindParam(':country',$country,PDO::PARAM_STR);
$stmt->execute();
}
echo“更新了记录”。;}
语句中WHERE前面有逗号。这可能是问题所在。所有想知道的人(可能)OP代码的实际错误是什么:在
UPDATE`$tbl_name`SET`ssl`=:ssl,`exp`=:exp,`country`=:country,其中id=:id
,WHERE
之前的逗号是一个语法错误。仅此而已。缺少country
左侧的第一个反勾号,除非这只是一个输入错误。@Fred ii-I更新,显示表单确实存在错误es确实存在。在我选中复选框之前,表单和PHP都在工作。我是说在你的查询中,它说country=:country
,你缺少了一个backtick。第一个开头。@Fred ii-哦,对不起,我过度擦除了它。但仍然不工作。那么你是说只有当字段为空时才会发生错误?先生,if statement在$stmt->execute()之前关闭;你是对的,我的错误。尝试移动$stmt->bindParam(':exp',$exp,PDO::PARAM_STR);
和$stmt->bindParam(':country',$country,PDO::PARAM_STR);
在foreach loopYes中定义$exp
和$country
变量后,逗号是问题所在,因此PDO错误已停止。非常感谢您,现在关于发送值…先生,我们不能空$exp,要么我们使用新值更新exp,要么该值必须保留其原始值。发送空值将导致emp返回原始列,更像:if(isset($\u POST['thirtydays'][$id]){$exp=$\u POST['thirtydays'][$id];}否则{//什么都不做}