PHP 使用! 取反值的一个问题.

今天把项目上传到服务器后出现的问题,改变状态(0.1)的切换.之前的代码如下:

   public function Something()
    {
        if (IS_AJAX) {
            $id = I('post.id');
            $attr = I('post.attr');
            //获取状态(1 OR 0)
            $isshow = $this->product->where("id='$id'")->getField($attr);
            //设置状态为反
            if($this->product->where("id='$id'")->setField($attr,!$isshow))
            {
                $info = array('i' => 1, 'msg' => "改变状态成功");
            }else{
                $info = array('i' => 0, 'msg' => "改变状态失败");
            }
            $this->ajaxReturn($info);
        }
    }

以上代码在本地测试一切正常 但是到了服务器后将0设置为1正常,但是将1设置为0的时候SQL报错 SET is_top='' 也就是!$isshow可以将1取反为0 但是无法将0取反为1,结果为 ' '
后来不得已将$isshow使用三元赋值$isshow=$isshow==1?0:1;抛弃了之前的!$isshow的写法.bug解决了

疑问主要是?

为什么在linux环境下面 !$isshow取反可以由0取到1 但是1取到0则无法取出来呢?,新手一个谢谢大家.

php
lmaster
最佳答案
    public function Something()
    {
        if (IS_AJAX) {
            $id   = I('post.id');
            $attr = I('post.attr');
            // 获取状态 (1 OR 0)
            $isshow = $this->product->where("id='$id'")->getField($attr);
            if ($this->product->where("id='$id'")->setField($attr, !$isshow)) {
                // 设置状态为反
                $info = array('i' => 1, 'msg' => "改变状态成功");
            } else {
                $info = array('i' => 0, 'msg' => "改变状态失败");
            }
            $this->ajaxReturn($info);
        }
    }

这个样子就更好了,下面是我的测试代码

function debugF($data)
{
    echo sprintf("%X<br />", $data);
}

echo time(), '<br>';
$a = !0;
$b = !'0';
$c = !1;
$d = !'1';
debugF($a);
debugF($b);
debugF($c);
debugF($d);
var_dump($a, $b, $c, $d);

window (os:server2016,php:7.2.2)
PHP
linux (os:centos7.2,php:7.2.14)
PHP
额,不知道你的这个原因是什么原因

  • 是否是 php 框架影响
  • 是否是 php 版本影响
  • 是否是操作系统底层影响
4年前 评论
讨论数量: 5

差点搞晕,查了一下手册,! 运算符的返回结果只有 true 或 false ,如果试着 echo true 或者 echo false 的话,可以看到 echo true 会显示1,echo false 无显示,猜测 true自动转型为1,false自动转型为 null

! 是逻辑取反的,只判断真假

按照上面的代码,如果 $isshow得到的返回值只能为0或1的话,可以使用 ~ 来进行按位取反

4年前 评论

非常感谢回答,最后使用了(int)!$isshow这样的方法来获取0和1,只是不明白为什么直接写! $isshow在本地可以,而在linux下面就不行.

4年前 评论
lmaster
    public function Something()
    {
        if (IS_AJAX) {
            $id   = I('post.id');
            $attr = I('post.attr');
            // 获取状态 (1 OR 0)
            $isshow = $this->product->where("id='$id'")->getField($attr);
            if ($this->product->where("id='$id'")->setField($attr, !$isshow)) {
                // 设置状态为反
                $info = array('i' => 1, 'msg' => "改变状态成功");
            } else {
                $info = array('i' => 0, 'msg' => "改变状态失败");
            }
            $this->ajaxReturn($info);
        }
    }

这个样子就更好了,下面是我的测试代码

function debugF($data)
{
    echo sprintf("%X<br />", $data);
}

echo time(), '<br>';
$a = !0;
$b = !'0';
$c = !1;
$d = !'1';
debugF($a);
debugF($b);
debugF($c);
debugF($d);
var_dump($a, $b, $c, $d);

window (os:server2016,php:7.2.2)
PHP
linux (os:centos7.2,php:7.2.14)
PHP
额,不知道你的这个原因是什么原因

  • 是否是 php 框架影响
  • 是否是 php 版本影响
  • 是否是操作系统底层影响
4年前 评论

@crazy 还是3.2的哈哈哈

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!