запрос на обновление с помощью функций в typo3

#php #mysql #typo3

#php #mysql #typo3

Вопрос:

Я пытаюсь использовать функцию обновления typo3 с функцией объединения mysql. Можете ли вы сказать мне, как этим управлять? Что я пробовал:

 $updateArray = array("field" => 'CONCAT( field'.','.$toAppend.')');
$GLOBALS['TYPO3_DB']->exec_UPDATEquery ('table','id = '.'"'.$some_id.'"',$updateArray);
  

Это не работает, потому что этот запрос выполняется:

 UPDATE table
SET
pagesEdited='CONCAT( field,'value')'
WHERE
id = "id"
  

Как вы видите, concat функция экранирована.

Комментарии:

1. $updateArray = array(«поле» => «ОБЪЕДИНИТЬ ( field ,$toAppend)»;

2. @Sadikhasan: нет, это не работает, все еще экранировано

Ответ №1:

В справочной документации об этом не очень ясно, однако простое добавление TRUE к вашим параметрам функции обновления должно отключить цитирование:

 $GLOBALS['TYPO3_DB']->exec_UPDATEquery ('table','id = '.'"'.$some_id.'"',$updateArray, TRUE);
  

Это также означает, что вам придется выполнить собственную очистку входных данных перед обработкой запроса, если вы этого еще не сделали:

 $toAppend = $GLOBALS['TYPO3_DB']->fullQuoteString($toAppend, "");
  

Комментарии:

1. Спасибо, я не пробовал это, так как я сделал это по старинке, используя mysql_query функцию. Я прочитал только часть документации, и кажется разумным установить логическое значение в true .

2. @didierc Извините, что это не работает (по крайней мере, с TYPO3 версии 6.2). Вам нужно будет использовать имена полей в виде списка или массива в качестве последнего параметра.

Ответ №2:

Взгляните на noQuote параметр fullQuoteArray() метода TYPO3CMSCoreDatabaseDatabaseConnection , который используется exec_UPDATEquery() :

 @param boolean|array $noQuote List/array of keys NOT to quote (eg. SQL functions) - ONLY for associative arrays
  

И когда вы внимательно посмотрите на этот метод, вы увидите, что простое значение true не выполняет ожидаемый трюк. Просто используйте список полей (список, разделенный запятыми) или массив, чтобы сообщить TYPO3, какие поля не следует экранировать.

В вашем случае это выглядело бы так:

 $updateArray = array(
    'field' => 'CONCAT(field,' . $GLOBALS['TYPO3_DB']->fullQuoteString($toAppend, 'table') . ')',
);
$where = 'id = ' . $GLOBALS['TYPO3_DB']->fullQuoteString($some_id, 'table');

$GLOBALS['TYPO3_DB']->exec_UPDATEquery ('table', $where, $updateArray, 'field');
  

Комментарии:

1. Это здорово, спасибо. Также обратите внимание, что вместо 'field' вы можете использовать массив: array('field', 'and_more') или ['field, 'and_more']