【问题标题】:Insert_id not working on web uploaded in serverInsert_id 在服务器上传的网络上不起作用
【发布时间】:2016-09-18 01:06:20
【问题描述】:

我雇佣了 Cloudatcost,我已经配置了一个 Ubuntu 服务器,安装了 LAMP 并上传了我的网页。 我有一个部分,我上传了一些文本字段和一个图像,问题是图像没有被上传,但是当我在本地运行我的页面时它可以工作。

我的插入代码是这样的:

    function insert($title, $intro, $body, $data ,$date, $someid, $Myimage, $somesection){

    $ID = null;
    $mysqli = openConnection(); <- starts connection
    $query = "INSERT INTO columnsa (title, intro, body, data, date, someid) VALUES (?, ?, ?, ?, ?, ?)"; 
    if ($stmt = $mysqli->prepare($query))
    {
        $stmt->bind_param(

'sssssi', $title, $intro, $body, $data, $date, $someid);        
        /* Execution*/
        $stmt->execute();

        $ID = $mysqli->insert_id;
        /* Close query */
        $stmt->close();
    }
    if($ID)
    {
        if ($image != null) {
            insertImg($image, $ID, $section);
            closeConnection($mysqli);   
            return true;
        }
    }
    else
    {
        closeConnection($mysqli);
        return false;
    }
}

我的插入图片是:

    function insertImg($image, $ID, $section)
    {
        switch ($seccion) {
            case "journey":
                move_uploaded_file($imagen['tmp_name'], "../../img/journeys/".$ID.".jpg");
                break;
            case "column":
                move_uploaded_file($imagen['tmp_name'], "../../img/bolumns/".$ID.".jpg");
                break;
        case "blog":
            move_uploaded_file($imagen['tmp_name'], "../../img/blogs/".$ID.".jpg");
            break;
    }
}

我猜我可能忘记安装 php5 模块,因为这些行

$ID = $mysqli->insert_id;
        /* Close query */
        $stmt->close();
    }
    if($ID)
    {
        if ($image != null) {
            insertImg($image, $ID, $section);
            closeConnection($mysqli);   
            return true;
        }
    }
    else
    {
        closeConnection($mysqli);
        return false;
    }

似乎不起作用。任何想法哪个php5模块包含insert_id? 谢谢!

【问题讨论】:

  • 似乎更可能是关于在服务器文件系统中创建文件的权限问题
  • 有没有办法在ubuntu服务器中授予权限?
  • 取决于您的主机类型 (Cloudatcost)。一些主机提供文件管理器允许您设置权限,一些允许您限制 shell 访问,等等。

标签: php mysqli ubuntu-server


【解决方案1】:

1.检查该行是否插入到数据库中。如果它没有插入,你做错了什么。像错误的查询(例如字段名或,...)或连接问题。如果您没有数据库问题,请转到#2。

2.检查您尝试上传的文件夹是否具有适当的权限:

ls -l

如果它没有适当的权限。读这个: https://help.ubuntu.com/community/FilePermissions

3.如果数据库和权限都没有问题,则表示您尝试插入错误的文件夹。试试dirname(__FILE__)。它将获取您当前的文件目录。例如,改变这一行:

move_uploaded_file($imagen['tmp_name'], "../../img/journeys/".$ID.".jpg");

move_uploaded_file($imagen['tmp_name'], dirname(__FILE__)."/../../img/journeys/".$ID.".jpg");

查看日志

转到这个文件

sudo nano /var/log/apache2/error.log

如果您在此处找不到日志文件,请转到此文件以查找您的日志文件在哪里:

 sudo nano /etc/php_version/apache2/php.ini

*用正确的文件夹替换php_version

【讨论】:

  • 行被正确插入,唯一的问题是图片没有上传。 ls -1 是指在服务器控制台中执行该命令?
  • 我已经使用 ls -l ../path/myproyect 检查了权限,并且我的图像文件夹返回了 drwxr-xr-x 7 root root 4096 和一些日期。
  • 解决了!感谢 @james 使用 error.log 文件帮了大忙!
  • 很高兴它可以提供帮助。你有问题#2。如果您想知道如何读取权限,请阅读:linuxcommand.org/lts0070.php
【解决方案2】:

为了根据您提出的问题检索Last inserted ID,您必须运行

  1. 执行语句
  2. 查询语句

在插入之后为了在mysqli.*PDO顶部获得最后插入的ID。

在您的代码中,您必须更改获取最后插入的 ID 的方式,因为在执行之后您还没有运行查询。

替换:

$ID = $mysqli->insert_id;

与:

$ID = $stmt->insert_id;

注意:由于您只使用$stmt 而不是使用$mysqli 执行查询,因此您需要将其更改为我提到的。

以下是如何根据MysqliPDO获取最后插入的ID的示例

场景一:(Mysqli)

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    echo "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);

在这里,您在执行查询后运行了查询。

场景 2:(PDO)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)
    VALUES ('John', 'Doe', 'john@example.com')";
    // use exec() because no results are returned
    $conn->exec($sql);
    $last_id = $conn->lastInsertId();
    echo "New record created successfully. Last inserted ID is: " . $last_id;
    }
catch(PDOException $e)
    {
    echo $sql . "<br>" . $e->getMessage();
    }
$conn = null;
?> 

【讨论】:

    【解决方案3】:

    我已经通过分配适当的权限解决了这个问题。 正如this questions 所说

    确保所有文件都归 Apache 组和用户所有。在 Ubuntu 中,它是 www-data 组和用户

    chown -R www-data:www-data /path/to/webserver/www
    

    接下来启用 www-data 组的所有成员读写文件

    chmod -R g+rw /path/to/webserver/www
    

    我授予了对网页文件夹之外的图像文件夹的读写权限(由于良好的安全实践)。

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多