2013-05-26 58 views
0

我了解预处理语句是如何工作的,我需要插入200万行,所以在这种情况下,使用预准备语句对我来说是最好的选择。我的问题是我在row2和row3上有一个复合唯一键,所以我可以在准备好的语句中使用ON DUPLICATE KEY UPDATE,但是如果我希望使用条件,并且只有在最后更新的DATE在比较日期之前更新时才会更新?如果没有准备好的语句,我可以在ON DUPLICATE KEY UPDATE中使用一个简单的IF,但是我似乎无法用预处理语句实现它,因为变量已被绑定,并且将在创建预处理语句后在循环中进行设置。MYSQL PHP编写语句

$link = new mysqli(db_host,db_user,db_pass,db_db); 
if($link->connect_errno){ 
echo "Failed to connect to MySQL."; 
} 

if(!($stmt = $link->prepare("INSERT INTO table(`id`,`lastupdated`,`col1`,`col2`,`col3`,`col4`,`col5`,`col6`,`col7`,`col8`,`col9`) VALUES (?,?,?,?,?,?,?,?,?,?,?)"))){ 
echo "Prepare failed: (" . $link->errno . ") " . $link->error; 
} 
+0

如果你可以使用普通的语句中的'IF',你应该能够做同样的事情在准备好的声明。显示试图做这个广告的代码告诉我们你得到的错误。 – Barmar

+0

如果你不得不加载数百万条记录,而且它不是一个反复发生的事情,我会说看看'LOAD DATA INFILE'的mysql语法会快很多。 – Orangepill

回答

0

values()功能,可以在这种情况下使用,我相信,因为它会返回通过占位符在查询执行传递的实际值。

或者你可以简单地绑定同一个值两次,第一次为取值部分和第二的更新

+0

if(!($ stmt = $ link-> prepare(“INSERT INTO productsearch('PROGRAMNAME','LASTUPDATED','NAME','SKU','MANUFACTURER','CATEGORY','CURRENCY','SALEPRICE' ,'PRICE','IMAGEURL','SEARCH')VALUES(?,?,?,?,?,?,?,?,?,?)ON DUPLICATE KEY UPDATE col1 = IF($ lastupdated errno。”)“。 $链路>的错误; } – RobNHood

+0

问题是因为变量绑定$ lastupdated不会做任何事因为在preapared IF子句中 – RobNHood

+1

您应该用占位符替换'$ lastupdated',并像其他值一样绑定它们。 – Barmar