【问题标题】:Updating a mysql column to NULL through PHP is not working通过 PHP 将 mysql 列更新为 NULL 不起作用
【发布时间】:2014-12-02 15:04:16
【问题描述】:

当我点击这个按钮时,我的页面被转发到 removeRowValue.php 页面:

<a href="/includes/incl/removeRowValue.php?name=ontvangenklantdatum"><button type="button" class="btn btn-default">Empty</button></a>

我的 removeRowValue.php 页面:

<?php
session_start();
$str = (int) $_SESSION['rights'];
$accptList = array(1,3);
if(!in_array($str, $accptList)){          
    header('Location: index.php?pagina=login');
}
    require('conn.inc.php');
    $getName        = filter_input(INPUT_GET, "name", FILTER_SANITIZE_STRING);
    $columnName     = 'rd_' . $getName;
    $artCode        = $_SESSION['artcode'];
    $getadmrmaid    = $_SESSION['getadmrmaid'];

    $delRmaDetVal = $dbh->prepare("UPDATE rma_detail LEFT JOIN rma ON rma_detail.rd_rma_id=rma.r_id SET $columnName = NULL WHERE rd_artikel_code = :artcode AND r_nr = :getadmrmaid");
    $delRmaDetVal->bindParam(':artcode', $artcode, PDO::PARAM_STR);
    $delRmaDetVal->bindParam(':getadmrmaid', $getadmrmaid, PDO::PARAM_INT);   
    $delRmaDetVal->execute();

?>
  • 在我的 mysql 表中检查该列是否为空
  • 默认值为 NULL。

我已将 NULL 更新为某个值(即:2014-12-2),但现在我想在单击上面的按钮时将其恢复为 NULL,但这不起作用。我没有收到任何错误。

【问题讨论】:

  • 您的列是否允许为空? :D
  • 你能回显查询吗?
  • 超出了问题的范围,但从我的 PHP 时代记忆来看,您的安全检查已被破坏。如果$_SESSION['rights'] 不包含所需的$accptList,则设置一个标头以重定向到登录页面,但您不会退出脚本或将其余部分包装在else 中,因此即使标头已发送,不是吗?
  • @DanFarrell 这很有意义。介意我在回答中引用你的话吗?
  • 一点也不,请做

标签: php mysql


【解决方案1】:

你有

$artCode = $_SESSION['artcode'];

尚未在绑定中使用$artcode。注意小写的“c”。

变量区分大小写。因此,您需要将其更改为$artCode

使用error reporting 会发出未定义变量的信号。

在打开连接后立即添加$dbh-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);。

  • 您可能没有检查错误。

在文件顶部添加错误报告,这将有助于发现错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告应该只在暂存阶段完成,而不是在生产阶段。


在 cmets 中引用 Dan Farrell:

“超出了问题的范围,但从我的 PHP 时代记忆来看,您的安全检查已被破坏。如果 $_SESSION['rights'] 不包含需要$accptList,但您不会退出脚本或将其余部分包装在else 中,因此即使发送了标头,数据库代码也会执行,不是吗?”

  • 您还应该在标题后添加exit;。如果它退出到标头,那么您将知道这是您的代码的第一部分失败。

  • exit; 应始终跟在标头后面,这样做是一种很好的做法。


我还建议您检查所有会话名称是否确实使用isset() 设置,甚至可能在条件语句中使用empty() 设置为空。

即:

if( isset($_SESSION['artcode']) && !empty($_SESSION['artcode']) )

同时将其他会话变量添加到该条件,并检查您的列是否允许 NULL,如 cmets 中所述。

【讨论】:

  • 非常感谢您在这方面的帮助。我很高兴它现在可以工作,有时它不是代码,而只是一个愚蠢的错误。驼峰式写作成功了!
  • @DanFarrel & Fred 在你们给我带来了一些新东西之前,我并不知道!谢谢你。可悲的是,我不能给你们两个+1,因为我的声誉仍然没有快速增长,但做得很好!
  • @Peter 不客气,彼得。很高兴帮助并分享财富;)干杯
猜你喜欢
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2019-05-29
相关资源
最近更新 更多