繁体   English   中英

无法访问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和package 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事务。

  • 您在getYPackageIdwhile语句中有一个return ,这意味着while只会运行一次,因为一旦到达return便会执行该操作。 格式错误。

  • 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'];
          }
       }
}

感谢马丁提供的所有帮助和建议,不胜感激! 希望这可以通过不犯与我相同的愚蠢错误来帮助某人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM