【问题标题】:MySQL / PHP ( Foreign key mistake? )MySQL / PHP(外键错误?)
【发布时间】:2017-05-18 02:43:25
【问题描述】:

我有问题^^
我的 PHP 函数不想保存到我的 MySQL 表中,
但它会将其保存到我选择的文件夹中。 (连接工作(测试),将东西插入另一个表 从这个位置也可以工作。)
我认为这与外键有关,因为当我 作为示例执行此命令

INSERT INTO TBilder (BildPfad, BildFreigabe, UserId)VALUES ('asd', 0, 10005);  

它有效。它按预期做所有事情。

<div class="image_upload_div">
<form action= "#" class="dropzone"></form>
</div>

<?php
                    if (!empty($_FILES)) {
                        if (!is_dir($dir . "users") && !is_writable($dir. "users")) {
                            mkdir($dir . "users");
                        }
                        $temp = $_FILES['file']['tmp_name'];
                        $users = $dir . "users" . $ds;
                        $destination = $users . $_SESSION['userid'] . $ds;
                        $target = $destination . $_FILES['file']['name'];
                        if (!is_dir($destination) && !is_writable($destination)) {
                            mkdir($destination);
                        }

                        move_uploaded_file($temp, $target);

                        $stmt = $pdo->prepare("INSERT INTO TBilder (BildPfad, BildFreigabe, UserId) VALUES (:pfad, :freigabe, :user)");
                        $stmt->bindparam(":pfad", $target);
                        $stmt->bindparam(":freigabe", 0);
                        $stmt->bindparam(":user", $id);
                        $stmt->execute();

                    }

还有我的整个数据库:

DROP DATABASE SonderDB;
CREATE DATABASE SonderDB; 
use SonderDb;

DROP TABLE IF EXISTS TUsers;

CREATE TABLE IF NOT EXISTS TUsers (
  UserId INT AUTO_INCREMENT,
  UserName VARCHAR(255) NOT NULL,
  UserPassword VARCHAR(255) NOT NULL,
  PRIMARY KEY (UserId)) 
  AUTO_INCREMENT = 10000,
  ENGINE = InnoDB;



DROP TABLE IF EXISTS TBilder ;

CREATE TABLE IF NOT EXISTS TBilder (
  BildId INT AUTO_INCREMENT,
  BildPfad VARCHAR(255) NOT NULL,
  BildFreigabe INT,
  UserId INT,
  PRIMARY KEY (BildId),
  FOREIGN KEY (UserId) REFERENCES TUsers(UserId) ON UPDATE CASCADE)
  AUTO_INCREMENT = 10000
ENGINE = InnoDB;

【问题讨论】:

    标签: php mysql pdo foreign-keys dropzone.js


    【解决方案1】:
    • 因为BildFreigabeUserId 被定义为INT,所以它们应该这样准备(参见我的代码中的getInputParameterDataType())。我相信 80% 的人认为这是您的问题。
    • 我也会关注BildPfad,因为它被定义为NOT NULL
    • 如果可以的话,我会推荐使用异常处理,尤其是在数据库操作上。

    如果您愿意,我编写了更多代码,以便为您提供全局视图。祝你好运。


    <?php
    
    try {
        $pdo = getConnection();
    
        $sql = 'INSERT INTO TBilder (BildPfad, BildFreigabe, UserId) VALUES (:pfad, :freigabe, :user)';
        $stmt = $pdo->prepare($sql);
    
        if (!$stmt) {
            throw new Exception('The SQL statement can not be prepared!');
        }
    
        // Bind parameters by checking their datta type too!
        $stmt->bindparam(":pfad", $target, getInputParameterDataType($target));
        $stmt->bindparam(":freigabe", $freigabe, getInputParameterDataType(0));
        $stmt->bindparam(":user", $user, getInputParameterDataType($user));
    
        //********************************************************************
        // Try with bindValue(), if it's not working with bindParam().
        // It should. I normally work with bindValue().
        //********************************************************************
        // $stmt->bindValue(':pfad', $target, getInputParameterDataType($target));
        // $stmt->bindValue(':freigabe', $freigabe, getInputParameterDataType(0));
        // $stmt->bindValue(':user', $user, getInputParameterDataType($user));
        //********************************************************************
    
        if (!$stmt->execute()) {
            throw new Exception('The PDO statement can not be executed!');
        }
    
        $inserted = $stmt->rowCount() > 0 ? TRUE : FALSE;
    
        echo $inserted ? 'Inserted successfully' : 'Not inserted!';
    } catch (PDOException $pdoException) {
        echo '<pre>' . print_r($pdoException, true) . '</pre>';
        exit();
    } catch (Exception $exception) {
        echo '<pre>' . print_r($exception, true) . '</pre>';
        exit();
    }
    
    function getConnection() {
        $conn = new PDO('mysql:host=localhost;port=36;dbname=[...]', '[...]', '[...]');
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $conn->setAttribute(PDO::ATTR_PERSISTENT, true);
        return $conn;
    }
    
    function getInputParameterDataType($value) {
        $dataType = PDO::PARAM_STR;
        if (is_int($value)) {
            $dataType = PDO::PARAM_INT;
        } elseif (is_bool($value)) {
            $dataType = PDO::PARAM_BOOL;
        }
        return $dataType;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2010-10-23
      • 2013-11-15
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多