Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Mysqli准备不创建语句对象_Php_Mysqli_Prepared Statement - Fatal编程技术网

PHP Mysqli准备不创建语句对象

PHP Mysqli准备不创建语句对象,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我将php mysqli扩展用于准备语句,但在一个查询中,它没有创建查询对象 代码如下: $sqlq = "SELECT id,name FROM productcategories JOIN products ON productcategories.productid = products.id WHERE categoryid=?"; if($allsubcats) { foreach($allsubcats as $key => $data) { $

我将php mysqli扩展用于准备语句,但在一个查询中,它没有创建查询对象

代码如下:

$sqlq = "SELECT id,name FROM productcategories JOIN products ON productcategories.productid = products.id WHERE categoryid=?";
if($allsubcats)
{
    foreach($allsubcats as $key => $data)
    {
        $sqlq .= " OR categoryid=?";
    }
}
echo $sqlq;
if($query = $this->mysqli->connection->prepare($sqlq))
{
    $query->bind_param("i", $cat);
    if($allsubcats)
    {
        foreach($allsubcats as $key => $data)
        {
            $query->bind_param("i", $data[0]);
        }
    }
    $query->execute();
    $query->bind_result($id,$name);
    $query->store_result();
    if($query->num_rows > 0)
    {
        while($row = $query->fetch())
        {
            $allprods["id"] = $id;
            $allprods["name"] = $name;
        }
    }
    $query->close();
}
问题是:

if($query=$this->mysqli->connection->prepare($sqlq))

if()
返回false,因此不创建
$query
对象,也不执行if中的任何代码

echo$sqlq返回:

从productcategories中选择id、名称在productcategories.productid=products.id上加入产品,其中categoryid=?或categoryid=?或categoryid=?或categoryid=?或categoryid= 我看不出有什么问题

任何帮助都将不胜感激


谢谢,Nico

我认为您实际上并没有调用连接对象上的prepare,而只是调用mysqli对象本身

i、 e

应该是


if($query = $this->mysqli->prepare($sqlq))
编辑
签出第一个示例:

编辑2:

啊,是的,我明白了

作为一个旁注,你应该考虑别名表:


SELECT pc.id,p.name,p.id
FROM productcategories pc
JOIN products p ON pc.productid = p.id
WHERE categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=?

我认为您实际上并没有调用连接对象上的prepare,而只是调用mysqli对象本身

i、 e

应该是


if($query = $this->mysqli->prepare($sqlq))
编辑
签出第一个示例:

编辑2:

啊,是的,我明白了

作为一个旁注,你应该考虑别名表:


SELECT pc.id,p.name,p.id
FROM productcategories pc
JOIN products p ON pc.productid = p.id
WHERE categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=?

典型的情况是,我一发布这篇文章就自己解决了这个问题,有没有其他人在寻求帮助时就看得更清楚了

反正

选择id,name FROM productcategories在productcategories.productid=products.id上加入产品,其中categoryid=?或类别ID=?或类别ID=?或类别ID=?或类别ID=?或类别ID=

应该是


从productcategories中选择productcategories.id、products.name、products.id在productcategories.productid=products.id上加入产品,其中categoryid=?或类别ID=?或类别ID=?或类别ID=?或类别ID=?或者categoryid=?

典型的,我一发布这篇文章就自己解决了这个问题,有没有其他人在他们请求帮助时会看得更清楚

反正

选择id,name FROM productcategories在productcategories.productid=products.id上加入产品,其中categoryid=?或类别ID=?或类别ID=?或类别ID=?或类别ID=?或类别ID=

应该是


从productcategories中选择productcategories.id、products.name、products.id在productcategories.productid=products.id上加入产品,其中categoryid=?或类别ID=?或类别ID=?或类别ID=?或类别ID=?或者categoryid=?

嘿,尼科。这不是你问题的答案,因为你已经回答了。只是一个不请自来的建议。我不确定这个查询会运行多长时间,或者可以追加到多少个类别,但是你可能想考虑在语法中使用何处。 而不是:

WHERE foo = ? OR foo = ? OR foo = ? OR foo = ?
使用:


您将使查询更具可读性,并在应用程序中节省少量时间。(向MySQL发送的数据越少,PHP中的字符串越小)

嘿,尼科。这不是你问题的答案,因为你已经回答了。只是一个不请自来的建议。我不确定这个查询会运行多长时间,或者可以追加到多少个类别,但是你可能想考虑在语法中使用何处。 而不是:

WHERE foo = ? OR foo = ? OR foo = ? OR foo = ?
使用:


您将使查询更具可读性,并在应用程序中节省少量时间。(向MySQL发送更少的数据,PHP中更小的字符串)

一般来说是的,但在本例中$mysqli是自定义类的对象,其中$connection是$mysqli连接。一般来说是的,但在本例中$mysqli是自定义类的对象,其中$connection是$mysqli连接。您不是唯一一个,如果这能让你安心^^^你有一个很好的反应,回来给出解决方案:-)站起来投票回答你自己的问题谁会这么想:D@hobodave,是的,没错,虽然我倾向于把我那些不幸的朋友当作“橡皮鸭”。你不是唯一一个,如果这能让你放心的话^^^而且你有很好的反射能力,回来给出解决方案:-)站起来投票回答你自己的问题D@hobodave,是的,没错,虽然我倾向于把我那些不幸的朋友当作“橡皮鸭”。嗨,谢谢你,我会换的。我想我在某些方面越来越在行了,结果发现还有很多东西要学。我已经投了你的赞成票,但我不会把它标为被接受的答案,因为它不能回答问题。嗨,谢谢你,我会改变它的。我想我在某些方面越来越在行了,结果发现还有很多东西要学。我已经投了你的赞成票,但我不会把它作为被接受的答案,因为它不能回答问题。