没有“重复记录更新”的MySQL / PHP插入和更新与准备好的语句

时间:2013-08-13 15:41:13

标签: php mysql

看起来它应该很简单的事情再次证明不是这样。我想使用预准备语句插入和更新记录,因为它们提供了安全性。 MySQL声明“通常,你应该尽量避免在具有多个唯一索引的表上使用ON DUPLICATE KEY UPDATE子句。”虽然下面的查询没有显示多个表,但是一旦我开始工作,我将添加详细信息表(行项)到数据模型。如果我错了,请纠正我,但这表明我有多个独特的索引。 (主表上的键是order_num,行项表上的索引是order_num和line_num)。 因此,为了能够轻松地插入和更新表,我提出了以下不使用“重复密钥更新”的方案。第一个查询是INSERT IGNORE,它将插入一个新的订单号(如果它不在表中)并且如果订单号已经在表中则不执行任何操作。然后我运行一个更新查询,在第一种情况下将添加其余字段的值,在第二种情况下更新字段。
问题是只会运行第一个查询。第二个查询始终给出以下错误。无法在C:\ Sites ...第207行获取mysqli致命错误:在C:\ Sites ...中的非对象上调用成员函数bind_param()。我首先运行哪个查询,插入或更新无关紧要(如果我先运行更新,我会更新现有字段)。第二个查询总是失败。这似乎是某种表锁定问题,但即使在运行查询之间有3秒的睡眠语句,也会出现相同的错误。我很难过。 第二个问题是必须为插入表中的每个字段准备语句不是很优雅,但它有效。如果有更好的方法(这很简单!)我很想知道它。提前感谢能够提供指导的任何人。

function insert($arr){
    if(!$mysqli_1=MyDatabase::getConnection()):
        echo 'Cannot connect to database.'. mysqli_connect_errno();
        exit();
    endif;  
if($arr):
$cols=array_keys($arr);
$table_key_field_name=$cols[0];
$key_field_value=$arr[$table_key_field_name];
 $stmt_1 = $mysqli_1 -> prepare("INSERT IGNORE pi_hft_test_ajax ($table_key_field_name) VALUES(?) ");
 $stmt_1->bind_param("s", $key_field_value);//this binds the variables to the paramters (?) above, NOT the values;
 $stmt_1->execute();
endif; 
echo ' number of affected rows is '.$stmt_1->affected_rows.'<br />';
$stmt_1 -> close();
 $err = $mysqli_1->sqlstate;
 $mysqli_1 -> close();
}

function update($arr){
    if(!$mysqli=MyDatabase::getConnection()):
        echo 'Cannot connect to database.'. mysqli_connect_errno();
        exit();
    endif;

if($arr):
    $part=$arr['part']; 
    $cols=array_keys($arr); 
    foreach($arr as $key=> $value):
        $stmt = $mysqli -> prepare("UPDATE pi_hft_test_ajax SET $key=? WHERE part=? ");
        $stmt->bind_param("ss", $value, $part);//this binds the variables to the paramters (?) above, NOT the values;
        $stmt->execute();
    endforeach;
endif;  
$stmt -> close();
 echo '$mysqli->error is '.$mysqli->error.'<br />';
 echo 'SQLState is '. $mysqli->sqlstate;
 $mysqli -> close();
}

0 个答案:

没有答案