可以';t访问sql查询的mysqli_result对象


Can't access the mysqli_result Object of an sql query

嗨,我对这个方法有问题,它让我抓狂。下面的查询应该从数据库中返回一个字段,即与文件名匹配的id。只应返回一个值。当我运行查询时,我会返回一个SQL对象,看起来很好:

mysqli_result Object ( [current_field] => 0 [field_count] => 1 [lengths] => [num_rows] => 0 [type] => 0 ) 

然而,无论我尝试何种方式,我都无法访问上面的查询对象,或者至少我没有从中获得任何值。我也做了同样的操作来获取包id,它运行得很好。

我使用了$row=$result_package_id->fetch_array(MYSQLI_ASSOC);以获取package_id,我尝试了module_id,但没有成功。尝试了mysqli_fetch_array,但也不起作用。在不知道下一步该怎么办的时候,有人能帮忙吗?

添加了getPackageId方法和if语句,其中调用了这两个方法。每次查询成功时,都会检索id和包id,并使用这两个值创建一个新对象

function getId($fileName){
    $con = connect();
    if (!$con) {
        trigger_error(mysqli_error($con), E_USER_ERROR);
        die('Could not connect: ' . mysqli_error($con));
    }
    $yModuleId = 0;
    $sql_filename = mysqli_real_escape_string($con, $fileName);
    $query_module_id = "SELECT id FROM y_module WHERE fileName='" . $sql_filename . "'";
    $result_module_id = mysqli_query($con, $query_module_id);
    while($row_model = mysqli_fetch_array($result_module_id)){
        $yModuleId = $row_model['id'];
        return $yModuleId;
    }
}

function getYPackageId($package_name){
    $con = connect();
    if (!$con) {
        trigger_error(mysqli_error($con), E_USER_ERROR);
        die('Could not connect: ' . mysqli_error($con));
    }
    $sql_packageName = mysqli_real_escape_string($con, $package_name);
    $query_package_id = "SELECT id FROM y_package WHERE name='" . $package_name . "'";
    $result_package_id = mysqli_query($con, $query_package_id)  or die("__LINE__ : " . mysqli_error($con));
    while($row_package = mysqli_fetch_array($result_package_id)){
        $yPackageId = $row_package['id'];
        print_r($yPackageId);
        print_r("</br>");
        print_r("</br>");
        return $yPackageId;
    };
}
if($result_model && $result_package && $result_model_package) {
        $yModuleId = getId($fileName);
        $yPackageId = getYPackageId($package_name);
        $yIdObject = new YIds($yModuleId, $yaPackageId);
        $yIdObjects [] = $yIdObject;
        mysqli_query($con, "COMMIT");
        $message = array("success", "[SUCCESS]", "Model published successfully.",$module_id);
}

您可以使用

while ($row = $result->fetch_assoc()) {
   $saved[] = $row;
}

但我认为,从您显示的代码来看,一个更重要的问题是,您似乎混合了过程式和面向对象的SQL查询。

因此:

  • 1) 重写您的代码以使用对象,您对mysqli_函数的使用仅返回数组。

  • 2) 或者,将当前代码用作数组,因为它就是数组,而不是对象。

程序

function getId($fileName){
     //this does nothing. Unless this is a custom function?
     //$con = connect();
    // should be:
    $con = mysqli_connect(details,...);
    if (!$con) {
        trigger_error(mysqli_error($con), E_USER_ERROR); //?
        die('Could not connect: ' . mysqli_error($con));
    }
    //$yModuleId = 0; //unneeded.
    $sql_filename = mysqli_real_escape_string($con, $fileName);
    $query_module_id = "SELECT id FROM y_module WHERE fileName='" . $sql_filename . "'";
    //add an error feedback for debugging:
    $result_module_id = mysqli_query($con, $query_module_id) or die("__LINE__.":".mysqli_error($con));
    while($row_model = mysqli_fetch_array($result_module_id)){
        $yModuleId = $row_model['id'];
        return $yModuleId;
    }
}

面向对象:

 $query_module_id = "SELECT id FROM y_module WHERE fileName='?'";
$con = new mysqli($details,...);
$thisQuery = $con->prepare($query_module_id);
$thisQuery->bind_param("s",$sql_filename);
$thisQuery->execute();
 while ($row = $thisQuery->fetch_assoc()) {
       $saved[] = $row;
    }
$thisQuery->close();

由此得出的$saved变量将是一个结果数组。


附加说明:

  • 您在代码底部附近使用MySQL COMMIT,这是针对事务的,但您尚未显示您已经设置或开始任何MySQL事务。

  • getYPackageId中的while语句中有一个return,这意味着while只运行一次,因为一旦它达到返回值,它就会执行该操作。格式错误。

  • 删除while语句的右括号后的分号。这是错误的语法。

我解决了这个问题,我觉得自己像个白痴!问题出在这里

if($result_model && $result_package && $result_model_package) {
    $yModuleId = getId($fileName);
    $yPackageId = getYPackageId($package_name);
    $yIdObject = new YIds($yModuleId, $yaPackageId);
    $yIdObjects [] = $yIdObject;
    mysqli_query($con, "COMMIT");
    $message = array("success", "[SUCCESS]", "Model published successfully.",$module_id);
}

我在尝试从数据库中获取id和package_id之后运行提交,这就是为什么我没有得到任何结果。我把它改成这个:

if($result_model && $result_package && $result_model_package) {
     mysqli_query($con, "COMMIT");
     $yModuleId = getId($fileName);
    $yPackageId = getYPackageId($package_name);
    $yIdObject = new YIds($yModuleId, $yaPackageId);
    $yIdObjects [] = $yIdObject;
    $message = array("success", "[SUCCESS]", "Model published successfully.",$module_id);
}

它运行得很好。这就是getId()方法在工作时的样子

function getId($moduleName, $moduleRevision){

       $con = connect();
       if (!$con) {
           trigger_error(mysqli_error($con), E_USER_ERROR);
           die('Could not connect: ' . mysqli_error($con));
       }
       $sql_moduleName = mysqli_real_escape_string($con, $moduleName);
       $sql_moduleRevision = mysqli_real_escape_string($con, $moduleRevision);
       $query_module_id = "SELECT id, module_name, module_revision FROM y_module";
       $result_module_id = mysqli_query($con, $query_module_id);
       while($row = mysqli_fetch_assoc($result_module_id)){
          if($row['module_name'] === $moduleName && $row['module_revision'] == $moduleRevision){
          return $row['id'];
          }
       }
}

感谢Martin的帮助和建议,非常感谢!希望这能帮助别人,不要犯和我一样愚蠢的错误。