PHP准备语句失败

PHP准备语句失败,php,prepared-statement,Php,Prepared Statement,以下代码将在屏幕上显示“12”。仅此而已。这些回显号是为调试而添加的 它应该显示“123”,并将语句中的变量插入MySQL数据库。 出于某种原因,它只在prepare语句处结束。fail()错误检查从未被调用。实际上,在prepare语句之后不会调用任何内容 我已经在整个网站,并相信我做的一切要求正确,但它更可能是我做的事情 有人能告诉我为什么prepare语句会以这种方式失败吗 $query = "insert into member(mail, user, val) values (?, ?

以下代码将在屏幕上显示“12”。仅此而已。这些回显号是为调试而添加的

它应该显示“123”,并将语句中的变量插入MySQL数据库。 出于某种原因,它只在prepare语句处结束。fail()错误检查从未被调用。实际上,在prepare语句之后不会调用任何内容

我已经在整个网站,并相信我做的一切要求正确,但它更可能是我做的事情

有人能告诉我为什么prepare语句会以这种方式失败吗

$query = "insert into member(mail, user, val) values (?, ?, ?)";
$uuu = blah@blah.com;
$hhh = Blah Williams;
$val = 0;
echo "1";
if($stmt = $this->conn)
{
    echo "2";
    $stmt->prepare($query) || $this->fail('MySQL prepare', $stmt->error);
    echo "3";
    $stmt->bind_param('ssi', $uuu, $hhh, $val)
        || $this->fail('MySQL bind_param', $stmt->error);
    $stmt->execute();
    if (!$stmt->execute()) 
    {
        if ($stmt->errno === 1062 /* ER_DUP_ENTRY */)
        {
            $this->fail('This username is already taken');
        }
        else
        {
            $this->fail('MySQL execute', $stmt->error);
        }
    }
}
else 
{/*error check*/
    $this->fail('MySQL insert prepare failed', $stmt->error);
    return 0;
}
$stmt->close();
return true;

你应该使用,因为你的作业永远是真实的

$stmt = $this->conn->prepare($query);
要检查失败的原因,请使用:

var_dump($stmt->errorInfo());

如果($stmt=$this->conn->prepare($query))否-如果愿意,您可以保留| |$this->fail(..)。这两种方法都会检查它是否返回true,这取决于你想用什么逻辑来处理这个问题。是的,这实际上是我在所有调试之前的方式。没有意识到这一点很重要。如果($stmt=$this->conn)将始终为真,因为您正在检查分配是否成功OK,所以我尝试了if($stmt=$this->conn->prepare($query))和单独的$stmt=$this->conn->prepare($query),但调用prepare后仍然会失败。请确保始终启用php.ini设置以报告所有级别的错误,包括致命错误。它可以节省你很多时间。或者使用类似xdebug的调试扩展名。不幸的是,我无法访问此服务器上的php.ini文件。设置wamp/lamp/mamp进行本地开发和测试比设置任何第三方服务器都方便。尽管您可以使用在运行时覆盖一些php.ini设置