Как пропустить FieldNames, содержащие #, CreateMultipleInsertCommand без сбоев?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как пропустить FieldNames, содержащие #, CreateMultipleInsertCommand без сбоев?

Сообщение Anonymous »

У нас есть этот код, который работает хорошо большую часть времени, за исключением случая, я опишу слегка последнее: < /p>

Код: Выделить всё

/**
* Recovers archived survey responses
*
* @param int $surveyId survey ID
* @param string $archivedResponseTableName archived response table name to be imported
* @param bool $preserveIDs if archived response IDs should be preserved
* @param array $validatedColumns the columns that are validated and can be inserted again
* @return integer number of rows affected by the execution.
* @throws Exception execution failed
*/
function recoverSurveyResponses(int $surveyId, string $archivedResponseTableName, $preserveIDs, array $validatedColumns = []): int
{
if (!is_array($validatedColumns)) {
$validatedColumns = [];
}
$pluginDynamicArchivedResponseModel = PluginDynamic::model($archivedResponseTableName);
$targetSchema = SurveyDynamic::model($surveyId)->getTableSchema();
$encryptedAttributes = Response::getEncryptedAttributes($surveyId);
if ((App()->db->tablePrefix) && (strpos($archivedResponseTableName, App()->db->tablePrefix) === 0)) {
$tbl_name = str_replace('old_survey', 'old_tokens', substr($archivedResponseTableName, strlen(App()->db->tablePrefix)));
} else {
$tbl_name = str_replace('old_survey', 'old_tokens', $archivedResponseTableName);
}
$archivedTableSettings = ArchivedTableSettings::model()->findByAttributes(['tbl_name' => $tbl_name, 'tbl_type' => 'response']);
$archivedEncryptedAttributes = [];
if ($archivedTableSettings) {
$archivedEncryptedAttributes = json_decode($archivedTableSettings->properties, true);
}
$archivedResponses = new CDataProviderIterator(new CActiveDataProvider($pluginDynamicArchivedResponseModel), 500);

$tableName = "{{survey_$surveyId}}";
$importedResponses = 0;
$batchData = [];
foreach ($archivedResponses as $archivedResponse) {
$dataRow = [];
// Using plugindynamic model because I dont trust surveydynamic.
$targetResponse = new PluginDynamic($tableName);
if ($preserveIDs) {
$targetResponse->id = $archivedResponse->id;
$dataRow['id'] = $archivedResponse->id;
}

$to = 'new_c';
$from = 'old_c';
for ($index = 0; $index < count($validatedColumns[$to]); $index++) {
$source = $validatedColumns[$from][$index];
$target = $validatedColumns[$to][$index];
$targetResponse->{$target} = $archivedResponse[$source];
if (in_array($source, $archivedEncryptedAttributes, false) && !in_array($target, $encryptedAttributes, false)) {
$targetResponse->{$target} = $archivedResponse->decryptSingle($archivedResponse[$source]);
} elseif (!in_array($source, $archivedEncryptedAttributes, false) && in_array($target, $encryptedAttributes, false)) {
$targetResponse->{$target} = $archivedResponse->encryptSingle($archivedResponse[$source]);
} else {
$targetResponse->{$target} = $archivedResponse[$source];
}
$dataRow[$target] = $targetResponse->{$target};
}

$additionalFields = [
'token',
'submitdate',
'lastpage',
'startlanguage',
'seed',
'startdate',
'datestamp',
'version_number'
];

if (isset($targetSchema->columns['startdate']) && empty($targetResponse['startdate'])) {
$targetResponse->{'startdate'} = date("Y-m-d H:i", (int)mktime(0, 0, 0, 1, 1, 1980));
$dataRow['startdate'] = $targetResponse->{'startdate'};
}

if (isset($targetSchema->columns['datestamp']) && empty($targetResponse['datestamp'])) {
$targetResponse->{'datestamp'} = date("Y-m-d H:i", (int)mktime(0, 0, 0, 1, 1, 1980));
$dataRow['datestamp'] = $targetResponse->{'datestamp'};
}

foreach ($additionalFields as $additionalField) {
if (isset($archivedResponse->{$additionalField}) &&  isset($targetSchema->columns[$additionalField])) {
$dataRow[$additionalField] = $archivedResponse->{$additionalField};
}
}

$beforeDataEntryImport = new PluginEvent('beforeDataEntryImport');
$beforeDataEntryImport->set('iSurveyID', $surveyId);
$beforeDataEntryImport->set('oModel', $targetResponse);
App()->getPluginManager()->dispatchEvent($beforeDataEntryImport);

if ($targetResponse->validate()){
$batchData[] = $dataRow;
}
if (count($batchData) % 500 === 0) {
if ($preserveIDs) {
switchMSSQLIdentityInsert("survey_$surveyId", true);
}
$builder = App()->db->getCommandBuilder();
$command = $builder->createMultipleInsertCommand($tableName, $batchData);
$importedResponses += $command->execute();
if ($preserveIDs) {
switchMSSQLIdentityInsert("survey_$surveyId", false);
}
$batchData = [];
}

unset($targetResponse);
}

if (count($batchData)) {
if ($preserveIDs) {
switchMSSQLIdentityInsert("survey_$surveyId", true);
}
$builder = App()->db->getCommandBuilder();
$command = $builder->createMultipleInsertCommand($tableName, $batchData);
$importedResponses += $command->execute();
if ($preserveIDs) {
switchMSSQLIdentityInsert("survey_$surveyId", false);
}
}
return $importedResponses;
}
< /code>
Короче говоря, он динамически строит партии, не зная заранее, какая целевая таблица будет, каковы были ее поля. Обзор активируется, а архив ответов импортируется обратно. Он был выпущен весной, и жалоб не было. Но в последнее время, когда мы тестировали еще одну функцию, которую мы собирались выпустить, я понял, что это не очень хорошо работает для конкретного опроса ... 
Поэтому я отладил проблему и понял, что виновником является то, что ответы для некоторых типов вопросов хранятся в полях, содержащих #
, например, 282267x506x5569SQ04 #0 . Теперь при вызове cdbcommandbuilder :: createmultipleinsertcommand (см. https://www.yiiframework.com/doc/api/1. ... and-detail), я имею в виду

Код: Выделить всё

$command = $builder->createMultipleInsertCommand($tableName, $batchData);
Мы должны пройти $ batchdata , который представляет собой массив строк данных, каждая строка данных является ассоциативным массивом, который отображает имя столбца со значением столбца. Например: < /p>

Код: Выделить всё

[
[
//...
"282267X506X5569SQ04#0" =>  "some answher here"
//...
],
//...
]
< /code>
и это генерирует команду, которая выглядит так:  < /p>
INSERT INTO `lime_survey_282267` (`282267X506X5530`,
`282267X506X5531`,
`282267X507X5534SQ001`,
`282267X507X5534SQ002`,
`282267X507X5534SQ003`,
`282267X507X5534SQ004`,
`282267X504X5513`,
`282267X504X5514`,
`282267X504X5515`,
`282267X504X5516`,
`282267X504X5517`,
`282267X504X5518SQ01`,
`282267X504X5518SQ02`,
`282267X504X5518SQ03`,
`282267X504X5518SQ04`,
`282267X504X5519SQ01`,
`282267X504X5519SQ02`,
`282267X504X5519SQ03`,
`282267X504X5519SQ04`,
`282267X504X5520SQ01`,
`282267X504X5520SQ02`,
`282267X504X5520SQ03`,
`282267X504X5520SQ04`,
`282267X505X5521`,
`282267X505X5522SQ01`,
`282267X505X5522SQ02`,
`282267X505X5522SQ03`,
`282267X505X5522SQ04`,
`282267X505X5523SQ001`,
`282267X505X5523SQ002`,
`282267X505X5523SQ003`,
`282267X505X5524SQ01`,
`282267X505X5524SQ02`,
`282267X505X5524SQ03`,
`282267X505X5524SQ04`,
`282267X506X5525`,
`282267X506X5526`,
`282267X506X5527`,
`282267X506X5528`,
`282267X506X5549`,
`282267X506X5529`,
`282267X506X5530other`,
`282267X506X5531comment`,
`282267X506X5535`,
`282267X506X5536`,
`282267X506X5542`,
`282267X506X5538SQ01`,
`282267X506X5538SQ02`,
`282267X506X5538SQ03`,
`282267X506X5538SQ04`,
`282267X506X5547SQ01`,
`282267X506X5547SQ02`,
`282267X506X5547SQ03`,
`282267X506X5547SQ04`,
`282267X506X5539SQ01`,
`282267X506X5539SQ02`,
`282267X506X5539SQ03`,
`282267X506X5539SQ04`,
`282267X506X5540SQ01`,
`282267X506X5540SQ02`,
`282267X506X5540SQ03`,
`282267X506X5540SQ04`,
`282267X506X5541SQ01`,
`282267X506X5541SQ02`,
`282267X506X5541SQ03`,
`282267X506X5541SQ04`,
`282267X506X5550SQ01`,
`282267X506X5550SQ02`,
`282267X506X5550SQ03`,
`282267X506X5550SQ04`,
`282267X506X5546SQ01#0`,
`282267X506X5546SQ01#1`,
`282267X506X5546SQ02#0`,
`282267X506X5546SQ02#1`,
`282267X506X5546SQ03#0`,
`282267X506X5546SQ03#1`,
`282267X506X5546SQ04#0`,
`282267X506X5546SQ04#1`,
`282267X506X5569SQ01#0`,
`282267X506X5569SQ01#1`,
`282267X506X5569SQ02#0`,
`282267X506X5569SQ02#1`,
`282267X506X5569SQ03#0`,
`282267X506X5569SQ03#1`,
`282267X506X5569SQ04#0`,
`282267X506X5569SQ04#1`,
`282267X507X5532SQ01`,
`282267X507X5532SQ02`,
`282267X507X5532SQ03`,
`282267X507X5532SQ04`,
`282267X507X5532other`,
`282267X507X5533SQ01`,
`282267X507X5533SQ02`,
`282267X507X5533SQ03`,
`282267X507X5533SQ04`,
`282267X507X5533SQ05`,
`282267X507X5534SQ001comment`,
`282267X507X5534SQ002comment`,
`282267X507X5534SQ003comment`,
`282267X507X5534SQ004comment`,
`282267X507X5552`,
`282267X507X5553`,
`282267X507X55371`,
`282267X507X55372`,
`282267X507X55373`,
`282267X507X55374`,
`282267X507X55511`,
`282267X507X55512`,
`282267X507X55513`,
`282267X507X55514`,
`282267X508X5554`,
`282267X508X5555`,
`282267X508X5556`,
`282267X508X5557`,
`282267X508X5566`,
`282267X508X5567`,
`282267X508X5568`,
`282267X508X5558SH101`,
`282267X508X5558SH102`,
`282267X508X5559SQ201`,
`282267X508X5559SQ202`,
`282267X508X5562`,
`282267X508X5560`,
`282267X508X5561`,
`282267X509X5563SQ01`,
`282267X509X5563SQ02`,
`282267X509X5563SQ03`,
`282267X509X5563SQ04`,
`282267X509X5564SQ01`,
`282267X509X5564SQ02`,
`282267X509X5564SQ03`,
`282267X509X5564SQ04`,
`282267X509X5565SQ01`,
`282267X509X5565SQ02`,
`282267X509X5565SQ03`,
`282267X509X5565SQ04`,
`startdate`,
`datestamp`,
`lastpage`,
`startlanguage`,
`seed`)  V A L U E S   ( : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 0 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 4 S Q 0 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 4 S Q 0 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 4 S Q 0 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 4 S Q 0 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 5 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 6 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 7 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 8 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 8 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 8 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 8 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 9 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 9 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 9 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 1 9 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 2 0 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 2 0 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 2 0 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 4 X 5 5 2 0 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 2 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 2 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 2 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 2 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 3 S Q 0 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 3 S Q 0 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 3 S Q 0 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 4 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 4 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 4 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 5 X 5 5 2 4 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 2 5 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 2 6 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 2 7 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 2 8 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 9 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 2 9 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 0 o t h e r _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 1 c o m m e n t _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 5 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 6 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 8 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 8 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 8 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 8 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 7 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 7 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 7 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 7 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 9 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 9 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 9 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 3 9 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 0 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 0 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 0 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 0 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 1 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 1 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 1 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 1 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 5 0 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 5 0 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 5 0 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 5 0 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 6 S Q 0 1 # 0 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 6 S Q 0 1 # 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 6 S Q 0 2 # 0 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 6 S Q 0 2 # 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 6 S Q 0 3 # 0 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 6 S Q 0 3 # 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 6 S Q 0 4 # 0 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 4 6 S Q 0 4 # 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 6 9 S Q 0 1 # 0 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 6 9 S Q 0 1 # 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 6 9 S Q 0 2 # 0 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 6 9 S Q 0 2 # 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 6 9 S Q 0 3 # 0 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 6 9 S Q 0 3 # 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 6 9 S Q 0 4 # 0 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 6 X 5 5 6 9 S Q 0 4 # 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 2 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 2 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 2 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 2 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 2 o t h e r _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 3 S Q 0 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 3 S Q 0 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 3 S Q 0 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 3 S Q 0 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 3 S Q 0 5 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 4 S Q 0 0 1 c o m m e n t _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 4 S Q 0 0 2 c o m m e n t _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 4 S Q 0 0 3 c o m m e n t _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 4 S Q 0 0 4 c o m m e n t _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 5 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 5 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 7 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 7 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 7 3 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 3 7 4 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 5 1 1 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 5 1 2 _ 0 , < b r   / >   : 2 8 2 2 6 7 X 5 0 7 X 5 5 5 1 3 _ 0 , < b r   / >   : 2 8 2 2 6 7X507X55514_0,
:282267X508X5554_0,
:282267X508X5555_0,
:282267X508X5556_0,
:282267X508X5557_0,
:282267X508X5566_0,
:282267X508X5567_0,
:282267X508X5568_0,
:282267X508X5558SH101_0,
:282267X508X5558SH102_0,
:282267X508X5559SQ201_0,
:282267X508X5559SQ202_0,
:282267X508X5562_0,
:282267X508X5560_0,
:282267X508X5561_0,
:282267X509X5563SQ01_0,
:282267X509X5563SQ02_0,
:282267X509X5563SQ03_0,
:282267X509X5563SQ04_0,
:282267X509X5564SQ01_0,
:282267X509X5564SQ02_0,
:282267X509X5564SQ03_0,
:282267X509X5564SQ04_0,
:282267X509X5565SQ01_0,
:282267X509X5565SQ02_0,
:282267X509X5565SQ03_0,
:282267X509X5565SQ04_0,
:startdate_0,
:datestamp_0,
:lastpage_0,
:startlanguage_0,
:seed_0),
(:282267X506X5530_1,
:282267X506X5531_1,
:282267X507X5534SQ001_1,
:282267X507X5534SQ002_1,
:282267X507X5534SQ003_1,
:282267X507X5534SQ004_1,
:282267X504X5513_1,
:282267X504X5514_1,
:282267X504X5515_1,
:282267X504X5516_1,
:282267X504X5517_1,
:282267X504X5518SQ01_1,
:282267X504X5518SQ02_1,
:282267X504X5518SQ03_1,
:282267X504X5518SQ04_1,
:282267X504X5519SQ01_1,
:282267X504X5519SQ02_1,
:282267X504X5519SQ03_1,
:282267X504X5519SQ04_1,
:282267X504X5520SQ01_1,
:282267X504X5520SQ02_1,
:282267X504X5520SQ03_1,
:282267X504X5520SQ04_1,
:282267X505X5521_1,
:282267X505X5522SQ01_1,
:282267X505X5522SQ02_1,
:282267X505X5522SQ03_1,
:282267X505X5522SQ04_1,
:282267X505X5523SQ001_1,
:282267X505X5523SQ002_1,
:282267X505X5523SQ003_1,
:282267X505X5524SQ01_1,
:282267X505X5524SQ02_1,
:282267X505X5524SQ03_1,
:282267X505X5524SQ04_1,
:282267X506X5525_1,
:282267X506X5526_1,
:282267X506X5527_1,
:282267X506X5528_1,
:282267X506X5549_1,
:282267X506X5529_1,
:282267X506X5530other_1,
:282267X506X5531comment_1,
:282267X506X5535_1,
:282267X506X5536_1,
:282267X506X5542_1,
:282267X506X5538SQ01_1,
:282267X506X5538SQ02_1,
:282267X506X5538SQ03_1,
:282267X506X5538SQ04_1,
:282267X506X5547SQ01_1,
:282267X506X5547SQ02_1,
:282267X506X5547SQ03_1,
:282267X506X5547SQ04_1,
:282267X506X5539SQ01_1,
:282267X506X5539SQ02_1,
:282267X506X5539SQ03_1,
:282267X506X5539SQ04_1,
:282267X506X5540SQ01_1,
:282267X506X5540SQ02_1,
:282267X506X5540SQ03_1,
:282267X506X5540SQ04_1,
:282267X506X5541SQ01_1,
:282267X506X5541SQ02_1,
:282267X506X5541SQ03_1,
:282267X506X5541SQ04_1,
:282267X506X5550SQ01_1,
:282267X506X5550SQ02_1,
:282267X506X5550SQ03_1,
:282267X506X5550SQ04_1,
:282267X506X5546SQ01#0_1,
:282267X506X5546SQ01#1_1,
:282267X506X5546SQ02#0_1,
:282267X506X5546SQ02#1_1,
:282267X506X5546SQ03#0_1,
:282267X506X5546SQ03#1_1,
:282267X506X5546SQ04#0_1,
:282267X506X5546SQ04#1_1,
:282267X506X5569SQ01#0_1,
:282267X506X5569SQ01#1_1,
:282267X506X5569SQ02#0_1,
:282267X506X5569SQ02#1_1,
:282267X506X5569SQ03#0_1,
:282267X506X5569SQ03#1_1,
:282267X506X5569SQ04#0_1,
:282267X506X5569SQ04#1_1,
:282267X507X5532SQ01_1,
:282267X507X5532SQ02_1,
:282267X507X5532SQ03_1,
:282267X507X5532SQ04_1,
:282267X507X5532other_1,
:282267X507X5533SQ01_1,
:282267X507X5533SQ02_1,
:282267X507X5533SQ03_1,
:282267X507X5533SQ04_1,
:282267X507X5533SQ05_1,
:282267X507X5534SQ001comment_1,
:282267X507X5534SQ002comment_1,
:282267X507X5534SQ003comment_1,
:282267X507X5534SQ004comment_1,
:282267X507X5552_1,
:282267X507X5553_1,
:282267X507X55371_1,
:282267X507X55372_1,
:282267X507X55373_1,
:282267X507X55374_1,
:282267X507X55511_1,
:282267X507X55512_1,
:282267X507X55513_1,
:282267X507X55514_1,
:282267X508X5554_1,
:282267X508X5555_1,
:282267X508X5556_1,
:282267X508X5557_1,
:282267X508X5566_1,
:282267X508X5567_1,
:282267X508X5568_1,
:282267X508X5558SH101_1,
:282267X508X5558SH102_1,
:282267X508X5559SQ201_1,
:282267X508X5559SQ202_1,
:282267X508X5562_1,
:282267X508X5560_1,
:282267X508X5561_1,
:282267X509X5563SQ01_1,
:282267X509X5563SQ02_1,
:282267X509X5563SQ03_1,
:282267X509X5563SQ04_1,
:282267X509X5564SQ01_1,
:282267X509X5564SQ02_1,
:282267X509X5564SQ03_1,
:282267X509X5564SQ04_1,
:282267X509X5565SQ01_1,
:282267X509X5565SQ02_1,
:282267X509X5565SQ03_1,
:282267X509X5565SQ04_1,
:startdate_1,
:datestamp_1,
:lastpage_1,
:startlanguage_1,
:seed_1)
< /code>
,  а затем заполнители получают некоторые значения из архивов. Я сделал некоторую отладку, и я могу с абсолютной уверенностью сказать, что виновником является то, что имена столбцов содержат хэштеги, и эти хэштеги не очень хорошо работают вместе с заполнителями (см. Допустимые персонажи PDO). Refactor Все ссылки на имена столбцов, которые имеют хэштеги. Если все остальное не удастся, я найду какую -то другую пакетную функциональность или внедрим свои собственные с нуля. Тем не менее, я колебаюсь, потому что необходимо поддерживать несколько RDBMS, таких как MySQL, PostgresQL, SQL Server и т. Д.  Внутренне это то, что выполняла функция: < /p>
    /**
* Creates a multiple INSERT command.
* This method could be used to achieve better performance during insertion of the large
* amount of data into the database tables.
* @param mixed $table the table schema ({@link CDbTableSchema}) or the table name (string).
* @param array[] $data list data to be inserted, each value should be an array in format (column name=>column value).
* If a key is not a valid column name, the corresponding value will be ignored.
* @return CDbCommand multiple insert command
* @since 1.1.14
*/
public function createMultipleInsertCommand($table,array $data)
{
return $this->composeMultipleInsertCommand($table,$data);
}
< /code>
и, конечно, функция, которую она вызывает: < /p>
    /**
* Creates a multiple INSERT command.
* This method compose the SQL expression via given part templates, providing ability to adjust
* command for different SQL syntax.
* @param mixed $table the table schema ({@link CDbTableSchema}) or the table name (string).
* @param array[] $data list data to be inserted, each value should be an array in format (column name=>column value).
* If a key is not a valid column name, the corresponding value will be ignored.
* @param array $templates templates for the SQL parts.
* @return CDbCommand multiple insert command
* @throws CDbException if $data is empty.
*/
protected function composeMultipleInsertCommand($table,array $data,array $templates=array())
{
if (empty($data))
throw new CDbException(Yii::t('yii','Can not generate multiple insert command with empty data set.'));
$templates=array_merge(
array(
'main'=>'INSERT INTO {{tableName}} ({{columnInsertNames}}) VALUES {{rowInsertValues}}',
'columnInsertValue'=>'{{value}}',
'columnInsertValueGlue'=>', ',
'rowInsertValue'=>'({{columnInsertValues}})',
'rowInsertValueGlue'=>', ',
'columnInsertNameGlue'=>', ',
),
$templates
);
$this->ensureTable($table);
$tableName=$table->rawName;
$params=array();
$columnInsertNames=array();
$rowInsertValues=array();

$columns=array();
foreach($data as $rowData)
{
foreach($rowData as $columnName=>$columnValue)
{
if(!in_array($columnName,$columns,true))
if($table->getColumn($columnName)!==null)
$columns[]=$columnName;
}
}
foreach($columns as $name)
$columnInsertNames[$name]=$this->getDbConnection()->quoteColumnName($name);
$columnInsertNamesSqlPart=implode($templates['columnInsertNameGlue'],$columnInsertNames);

foreach($data as $rowKey=>$rowData)
{
$columnInsertValues=array();
foreach($columns as $columnName)
{
$column=$table->getColumn($columnName);
$columnValue=array_key_exists($columnName,$rowData) ? $rowData[$columnName] :  new CDbExpression('NULL');
if($columnValue instanceof CDbExpression)
{
$columnInsertValue=$columnValue->expression;
foreach($columnValue->params as $columnValueParamName=>$columnValueParam)
$params[$columnValueParamName]=$columnValueParam;
}
else
{
$columnInsertValue=':'.$columnName.'_'.$rowKey;
$params[':'.$columnName.'_'.$rowKey]=$column->typecast($columnValue);
}
$columnInsertValues[]=strtr($templates['columnInsertValue'],array(
'{{column}}'=>$columnInsertNames[$columnName],
'{{value}}'=>$columnInsertValue,
));
}
$rowInsertValues[]=strtr($templates['rowInsertValue'],array(
'{{tableName}}'=>$tableName,
'{{columnInsertNames}}'=>$columnInsertNamesSqlPart,
'{{columnInsertValues}}'=>implode($templates['columnInsertValueGlue'],$columnInsertValues)
));
}

$sql=strtr($templates['main'],array(
'{{tableName}}'=>$tableName,
'{{columnInsertNames}}'=>$columnInsertNamesSqlPart,
'{{rowInsertValues}}'=>implode($templates['rowInsertValueGlue'], $rowInsertValues),
));
$command=$this->getDbConnection()->createCommand($sql);

foreach($params as $name=>$value)
$command->bindValue($name,$value);

return $command;
}
Итак, насколько я знаю, мне нужно передать точное имя столбца, чтобы в INSERT предложение идентифицировало его должным образом. И в то же время я получаю < /p>

cdbcommand не удалось выполнить оператор SQL: sqlstate [hy093]: неверный номер параметра: параметр не был дефицит. Дело в том, что тот же ключ идентифицирует столбец и, следовательно, должен иметь # в его имени, и, как это ни парадоксально, заполнитель также генерируется из этого.

Код: Выделить всё

class LSCDbCommandBuilder extends CdbCommandBuilder {
/**
* Creates a multiple INSERT command.
* This method compose the SQL expression via given part templates, providing ability to adjust
* command for different SQL syntax.
* @param mixed $table the table schema ({@link CDbTableSchema}) or the table name (string).
* @param array[] $data list data to be inserted, each value should be an array in format (column name=>column value).
* If a key is not a valid column name, the corresponding value will be ignored.
* @param array $templates templates for the SQL parts.
* @return CDbCommand multiple insert command
* @throws CDbException if $data is empty.
*/
protected function composeMultipleInsertCommand($table,array $data,array $templates=array())
{
if (empty($data))
throw new CDbException(Yii::t('yii','Can not generate multiple insert command with empty data set.'));
$templates=array_merge(
array(
'main'=>'INSERT INTO {{tableName}} ({{columnInsertNames}}) VALUES {{rowInsertValues}}',
'columnInsertValue'=>'{{value}}',
'columnInsertValueGlue'=>', ',
'rowInsertValue'=>'({{columnInsertValues}})',
'rowInsertValueGlue'=>', ',
'columnInsertNameGlue'=>', ',
),
$templates
);
$this->ensureTable($table);
$tableName=$table->rawName;
$params=array();
$columnInsertNames=array();
$rowInsertValues=array();

$columns=array();
foreach($data as $rowData)
{
foreach($rowData as $columnName=>$columnValue)
{
if(!in_array($columnName,$columns,true))
if($table->getColumn($columnName)!==null)
$columns[]=$columnName;
}
}
foreach($columns as $name)
$columnInsertNames[$name]=$this->getDbConnection()->quoteColumnName($name);
$columnInsertNamesSqlPart=implode($templates['columnInsertNameGlue'],$columnInsertNames);

foreach($data as $rowKey=>$rowData)
{
$columnInsertValues=array();
foreach($columns as $columnName)
{
$placeholder = str_replace("#", "hashtag", $columnName);
$column=$table->getColumn($columnName);
$columnValue=array_key_exists($columnName,$rowData) ? $rowData[$columnName] :  new CDbExpression('NULL');
if($columnValue instanceof CDbExpression)
{
$columnInsertValue=$columnValue->expression;
foreach($columnValue->params as $columnValueParamName=>$columnValueParam)
$params[$columnValueParamName]=$columnValueParam;
}
else
{
$columnInsertValue=':'.$placeholder.'_'.$rowKey;
$params[':'.$placeholder.'_'.$rowKey]=$column->typecast($columnValue);
}
$columnInsertValues[]=strtr($templates['columnInsertValue'],array(
'{{column}}'=>$columnInsertNames[$placeholder],
'{{value}}'=>$columnInsertValue,
));
}
$rowInsertValues[]=strtr($templates['rowInsertValue'],array(
'{{tableName}}'=>$tableName,
'{{columnInsertNames}}'=>$columnInsertNamesSqlPart,
'{{columnInsertValues}}'=>implode($templates['columnInsertValueGlue'],$columnInsertValues)
));
}

$sql=strtr($templates['main'],array(
'{{tableName}}'=>$tableName,
'{{columnInsertNames}}'=>$columnInsertNamesSqlPart,
'{{rowInsertValues}}'=>implode($templates['rowInsertValueGlue'], $rowInsertValues),
));
$command=$this->getDbConnection()->createCommand($sql);

foreach($params as $name=>$value)
$command->bindValue($name,$value);

return $command;
}
}
Но мне интересно, есть ли другой способ, который не потребовал бы, чтобы я мог реализовать необработанные запросы или расширить класс, чтобы просто переопределить этот метод.

Подробнее здесь: https://stackoverflow.com/questions/797 ... hout-crash
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»