Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 更新行(如果存在),如果不存在,则创建新行_Php_Mysql - Fatal编程技术网

Php 更新行(如果存在),如果不存在,则创建新行

Php 更新行(如果存在),如果不存在,则创建新行,php,mysql,Php,Mysql,我正在将姓名、号码和公司插入数据库 我的桌子很简单: id(primary key) name slideView company 如果传递给它的名称存在,我需要更新此信息,如果不存在,则使用此数据创建新行。我已经把替换为了,但我认为这对我不起作用。。。因为我根本不碰身份证 我的代码是: insertData($name,$count,$company); function insertData($name, $count, $company) { #Try/Catch state

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

我的桌子很简单:

id(primary key)
name
slideView
company
如果传递给它的名称存在,我需要更新此信息,如果不存在,则使用此数据创建新行。我已经把
替换为
了,但我认为这对我不起作用。。。因为我根本不碰身份证

我的代码是:

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新手,还没有找到一个好方法来实现这一点。

替换为应该可以很好地工作-它还检查具有唯一约束的列。因此,您只需要将其替换为将其标识为重复的


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

您最好使用
插入。。。在重复更新时
此语法,虽然这意味着传递一些额外的参数,但它可以取消某些似乎不断出现的语法

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将包含相同的信息),因为在查询中任何参数都不能使用两次。

这似乎是正确的。尽管它抛出了这个错误:
error:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行“SET slideView=NULL,company=NULL”附近使用的正确语法。此外,我正在运行MySQL版本
5.1.61
I已删除
SET
,并运行了查询,虽然没有更新任何内容,但每次都会添加新行。@m是否将表中的
name
设置为唯一行?是吗?我选择返回到原来的状态。一旦我将我的名字列标记为唯一,它就起作用了。谢谢