php - sql + php-插入前检查重复项

标签 php mysql

我试图在插入语句之前检查重复项,在查看了一些帖子之后,我仍然无法弄清楚我的 php 中出了什么问题,下面是我的代码,请告诉我我的 php 中是否有某些内容或者在我的sql中..谢谢!!

date_default_timezone_set("America/Los_Angeles");
$time = date("y-m-d H:i:s");

//$name = $_POST["name"];
$name = "bulbasaur";
$lcname = strtolower($name);
if(empty($_POST["nickname"])) {
    $nickname = strtoupper($name);
} else {
    $nickname = $_POST["nickname"];
}



//Connect SQL & PHP
$host = getenv('IP');
$user = getenv('C9_USER');
$password = "";
$dbname = "hw7";

// Create connection
$ds = "mysql:host={$host};dbname={$dbname};charset=utf8";

// Make connection
try {
    $db = new PDO($ds, $user, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   
}
catch(PDOException $ex) {
    header("Content-Type: text/plain");
    echo "Can not connect to the database. Please try again later. \n";
    echo "Error details: $ex \n";
    die();
}

//check duplicates
$subsql = "SELECT name FROM Pokedex WHERE name = {$name})";
try {
$dupe = $db->prepare($subsql);
$param = array("name" => $name);
$dupe->execute($param);
}
catch(PDOException $ex) {
    die($ex->getMessage()."\n");
}
if($dupe-> rowCount() > 0) {
    echo "fail";
} else {
    $sql = "INSERT INTO Pokedex(name, nickname, datefound) 
        VALUES (:name, :nickname, :datefound);";
    try{
        $stmt = $db->prepare($sql);
        $params = array(":name" => $lcname, 
                ":nickname" => $nickname, 
                ":datefound" => $time);
        $stmt->execute($params);
    }
    catch(PDOException $ex) {
        die($ex->getMessage());
    }
}

我收到此错误消息 - 请帮助我...

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

由于该消息提到了有关我的 sql 的内容,因此这是我的 sql 代码-

DROP TABLE IF EXISTS Pokedex;
CREATE TABLE Pokedex(
  name          VARCHAR(30)     PRIMARY KEY,
  nickname      VARCHAR(30),
  datefound     DATETIME      
);

INSERT INTO Pokedex(name,nickname,datefound) VALUES 
("Pikachu","Pika","2018-01-03 12:23:44");

最佳答案

你有两个问题。

首先,您有一个拼写错误,查询末尾有一个额外的 ) 。这就是导致语法错误的原因。

其次,您使用的是带有 $param = array("name"=> $name); 的准备好的语句。所以你不需要放{$name},在查询中,你必须放一个占位符。

$subsql = "SELECT name FROM Pokedex WHERE name = :name";

或者,您可以尝试INSERT,而不是自己检查重复项。如果它有重复的名称,您将收到错误消息,您可以在 catch block 中检查这一点。

catch(PDOException $e) {
    if ($e->code == 2627) { // Violation of primary key constraint
        echo "fail";
    } else {
        die($ex->getMessage());
    }
}

关于php - sql + php-插入前检查重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50636485/

相关文章:

php - laravel: Route::group - 如何理解::here 的语法。因为Route类中没有静态函数 `group`

php - 如何在 Laravel 5 表单请求中使用请求路由参数?

php - 单选按钮阵列 - 需要帮助

PHP+Mysql 在一行中显示多行的值

javascript - 通过 PHP 和 JQuery 在 SQL 中保存表单数据始终失败

javascript - 使用模态弹出联系表单,是否可以在提交时在同一弹出窗口中显示确认?

php - 一个同时使用elasticsearch和mysql的app

mysql - 使用 SQL 根据分隔符将字符串解析为行间隔行

php - 如何将 MySQL 行折叠为列结果

java.sql.SQLException : Access denied for user 'wineship' @'localhost' (using password: YES) 异常