7

我正在将姓名、号码和公司插入数据库。

我的桌子很简单:

id(primary key)
name
slideView
company

如果传递给它的名称存在,我需要更新此信息,如果不使用此数据创建新行。我看过,REPLACE INTO但我认为这对我不起作用……因为我根本不碰身份证。

我的代码是:

insertData($name,$count,$company);

function insertData($name, $count, $company) {

    #Try/Catch statement to connect to DB, and insert data
    try {
        #DB username/password   
        $usernameDB = '****';
        $passwordDB = '****';

        #Create new PHP Database Object with the address, username, and password as parameters
        $pdo = new PDO('mysql:host=localhost;dbname=*****', $usernameDB, $passwordDB);

        #Set pdo attributes to handle errors 
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        #assign the sth variable (sth means statement handle) to insert the data
        $sth = $pdo->prepare("REPLACE INTO ***** SET name = ?, slideView = ?, company = ?");

        #Execute the insert
        $sth->execute(array($name,$count,$company));

    #Error if can't connect or insert
    } catch(PDOException $e) {
        echo 'Error: ' . $e->getMessage();
    }#/try
}

我是 SQL 新手,还没有找到一个很好的方法来做到这一点。

4

2 回答 2

4

您可能会更好地insert ... on duplicate update为此使用语法,尽管这意味着传递一些额外的参数,但它可以将替换中的某些问题消除为似乎不断出现的语法。

REPLACE INTO ***** SET name = ?, slideView = ?, company = ?

可以写成:

insert into yourTableName (name, slideView, company)
    values (:name, :slideView, :company)
    on duplicate key update set
        slideView=:$slideView2, company=:company2

然后执行如下:

$sth->execute(array(':name' => $name, ':slideView' => $count,
    ':company' => $company, ':slideView2' => $count, ':company2' => $company));

上面的格式使用命名参数(它们更容易阅读/调试)并将新行插入到数据库中 - 或者如果唯一/主键列name已经具有值,则使用剩余的行更新行信息。

您必须在此处使用两次参数(即使 slideView 和 company 将包含相同的信息),因为在查询中不能使用两次参数。

于 2012-09-19T23:16:00.440 回答
2

REPLACE INTO 应该可以正常工作 - 它还检查具有 UNIQUE 约束的列。因此,您只需将您的name列标记为唯一,以便 REPLACE INTO 将其识别为重复。

我没有尝试过这个特定的用例,但文档似乎允许这样做。

于 2012-09-19T23:01:57.700 回答