php-mysql_num_rows警告

时间:2013-01-28 11:08:43

标签: php mysql

  

可能重复:
  mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
  PHP (MySQL) error : “Warning: mysql_num_rows() expects parameter 1 to be resource”

我使用以下代码将文件上传到数据库中。我正在检查文件是否已存在。但是,当我检查时,我正在收到警告。

以下是我的代码。

    $filename = $_FILES["uploaded_file"]["name"];
    $location = "D:\\TrainingMaterials/";
    $path = $location . basename( $_FILES['uploaded_file']['name']); 
    $data = $mysqli->real_escape_string(file_get_contents($_FILES ['uploaded_file']['tmp_name']));
    move_uploaded_file( $_FILES["uploaded_file"]["tmp_name"], $location . $_FILES['uploaded_file']['name']);
    $q = "select Material_Name,Material_Data from training_material where Material_Name = '$filename' and Material_Data ='$data'";
    $rs = $mysqli->multi_query($q);
    if (mysql_num_rows($rs) == 0) 
    {
        $result = $mysqli->multi_query("call sp_upload_file('".$id."','" . $filename . "','".$path."','".$data."')");
        if ($result) 
        {
            do {
                if ($temp_resource = $mysqli->use_result()) 
                {
                    while ($row = $temp_resource->fetch_array(MYSQLI_ASSOC)) {
                        array_push($rows, $row);
                    }
                    $temp_resource->free_result();
                }
            } while ($mysqli->next_result());
        }
        echo "Successfully Uploaded";
    }
    else
    {
        echo "Material Already Uploaded";
    }

我得到的警告是

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in......

有人帮助我找出我做错了什么。谢谢你提前

3 个答案:

答案 0 :(得分:1)

  • 你正在混合mysqli(我在改进中)和mysql(在deprecated api中)函数。
  • 您的代码很容易sql injections,因为您没有正确编码查询的参数。由于您使用的是multi_query(),因此该脚本非常容易bobby tables。请搜索stackoverflow以获取防止此问题的好方法。
  • 在当前形式下,脚本只需要记录计数,而不是实际数据。在这种情况下,请使用SELECT Count()而不是检索实际数据
  • 如果没有locking,这种做法很容易race conditions。最好使用unique constraint,它不允许插入两个相同的(由密钥定义)记录。然后,您的脚本可以测试特定的错误代码,以向用户显示“数据库中的项目已读”消息。

编辑:参数$ data由$mysqli->real_escape_string正确处理 但$ filename也是“任意数据”,因为它几乎可以是客户端在http请求中发送的任何字符串。所以它也必须逃脱。

答案 1 :(得分:0)

而不是if(mysql_num_rows($rs) == 0),请使用if($rs->num_rows)

答案 2 :(得分:0)

echo $q;

你会得到一个查询在phpmyadmin中执行它,我猜这个查询是错误的。