csv レコードを取得して mysql データベースにインポートする csv スクリプトがあります。問題は、cakephp がデータの保存に失敗しており、cakephp が検証エラーを出していないことです。保存からparent_idまたはidを削除すると、すべてのレコードが正常にインポートされますが、idおよび親ID列を追加すると、保存されません。時々、最初のレコードを追加してから停止します。コードを見ていくと、cake は既に存在するレコードを見つけようとしています。既存の ID があっても挿入したい。
public function admin_uploadTopics() {
$enabled = true;
if($enabled) {
$response = array();
$response['success'] = 0;
$response['failure'] = 0;
//Represents a record set row number
$cr = 0;
//will hold each column field name
$field = array();
//variable that will store the entire record set
$d = array();
//opens csv file
if (($handle = fopen(APP."../topics", "r")) !== FALSE) {
//loops through each line
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
//creates a row
$d[$cr] = array();
for ($c=0; $c < $num; $c++) {
//if this is the first r, gather the field names
if($cr == 0) {
$field[$c] = $data[$c];
} else {//else gather the data
if($c == 0) {
$d[$cr]['Topic'] = array();
}//this constructs a array that puts the data with the correct field name
//this is the second row (1) but I want it to begin at 0 so I do cr-1
$d[$cr-1]['Topic'][$field[$c]] = $data[$c];
}
}
if($cr) {
//reset model
$this->Topic->create();
//save the row
//$d[$cr-1]['Topic']['id'] = '';
//$d[$cr-1]['Topic']['parent_id'] = '';
if($this->Topic->save($d[$cr-1], false)) {
$response['success'] += 1;
} else {
$response['failure'] += 1;
}
}
//create new record row
$cr++;
}
fclose($handle);
}
echo "There were ".$response['failure']." errors and ".$response['success']." success when resetting.";
exit();
}
exit();
}