Проблема
На самом деле я работаю над новым проектом веб-сайта с Symfony 5. Поскольку мне нужно получить доступ к исторической базе данных, где хранятся все данные о наших продуктах, я должен использовать AdoDb, чтобы я мог используйте драйвер odb c (поскольку doctrine не позволяет его использовать).
Когда я пытаюсь выбрать поле с диакритическим знаком, запрос не удался и выдает код ошибки S0022 . Полное сообщение об ошибке: "[Simba][SQLEngine] (31750) Column not found: ar1_händlerpreis"
Обратите внимание, что ar1_händlerpreis
содержат символ «ä», который, кажется, является проблемой.
То, что я уже пробовал
Здесь это мой код для запроса. Посмотрите на ar1_händlerpreis
, который присутствует в первом параметре функции «Prepare».
$strIn = "";// Adodb odbc doesn't support IN(?) with an array parameter (string are quoted automatically)
foreach ($array_article_number as $number) {
$strIn .= "?,";
}
$strIn = substr($strIn, 0, -1); // Last one doesn't need ',' characters as it's the last one.
$query = $this->_db->Prepare("SELECT ar1_artikelnummer, ar2_mwststeuerschl, ar1_bestand, ar1_klassifizierung, ar1_bezeichnung3, ar1_apothekenpreis, ar1_händlerpreis AS apreis FROM artikeldaten WHERE ar1_artikelnummer IN(" . $strIn . ")");
$datas = $this->_db->Execute($query, $array_article_number);
Я пытаюсь отредактировать поле ar1_händlerpreis в моей строке запроса как:
- ar1_h [ä] ndlerpreis (Как сказано здесь )
- `ar1_händlerpreis` (Окружение backstick ... Поскольку я знаю, что некоторые поля нужно экранировать)
- ar1_händlerpreis || '' (Как объясняется здесь он мог преобразовать имя столбца в выражение и не должно генерировать ошибку)
- ar1_händlerpreis + 0 (То же, что предыдущий , это могло быть преобразовано в выражение)
Я также пытался изменить кодировку символа для доступа к базе данных:
$this->_db->setConnectionParameter('CharacterSet','UTF-8');
(Как объясняется здесь )
Но ничего не поделаешь ...
Какой-то код
Я предлагаю вам дополнительный код, чтобы узнать, сделал ли я что-то не так.
Это моя служба ADOdbConnection, которую я использую, когда мне нужно подключиться к исторической базе данных. В большинстве случаев я использую Doctrine для конкретной базы данных веб-сайта c.
<?php
namespace App\Services;
use ADOConnection;
class ADOdbConnection
{
private ADOConnection $_db;
/**
* AdodbConnection constructor.
* @param $host
* @param $user
* @param $pwd
* @param $db_name
*/
public function __construct($host, $user, $pwd, $db_name)
{
$this->_db = ADONewConnection('odbc');
$this->_db->setConnectionParameter('CharacterSet','UTF-8');
$this->_db->connect('DRIVER={CONZEPT 16 ODBC-Treiber (64 bit)};SERVER='.$host.';DB='.$db_name.';', $user, $pwd, $db_name);
}
public function getDb() : ADOConnection{
return $this->_db;
}
}
Он работает так, как должен, выполняя подключение к базе данных.
Затем это это мой DAL для таблицы продукта (статьи):
<?php
namespace App\Services\DAL_w2;
use ADOConnection;
use App\Services\ADOdbConnection;
class ArticleDal
{
private ADOConnection $_db;
public function __construct(ADOdbConnection $ADOdbConnection)
{
$this->_db = $ADOdbConnection->getDb();
$this->_db->setCharset('UTF-8');
$this->_db->SetFetchMode(ADODB_FETCH_ASSOC);
}
/**
* Join w2 database for every article number given
* @param array $array_article_number An array of article number.
* @return array|null An array of article from w2 article's table or null
*/
public function getDataForListArticleFromArticleNumber(array $array_article_number): ?array
{
$res = null;
if (count($array_article_number)) {
$strIn = "";// Adodb doesn't support IN(?) with an array parameter (string are quoted automatically)
foreach ($array_article_number as $number) {
$strIn .= "?,";
}
$strIn = substr($strIn, 0, -1); // Last one doesn't need ',' characters as it's the last one.
$query = $this->_db->Prepare("SELECT ar1_artikelnummer, ar2_mwststeuerschl, ar1_bestand, ar1_klassifizierung, ar1_bezeichnung3, ar1_apothekenpreis, ar1_händlerpreis + 0 AS apreis FROM artikeldaten WHERE ar1_artikelnummer IN(" . $strIn . ")");
dump($query);
$datas = $this->_db->Execute($query, $array_article_number);
dump($this->_db->_errorCode);
dump($this->_db->_errorMsg);
dump($datas);
die();
// Assign article number as array key
$res = array();
foreach ($datas as $article_data) {
$res[$article_data['ar1_artikelnummer']] = $article_data;
}
}
$res = $res ?: null; // If we don't have any data
return $res;
}
}
Этот код отображает следующий результат:
ArticleDal. php в строке 37: "SELECT ar1_artikelnummer, ar2_mwststeuerschl , ar1_bestand, ar1_klassifizierung, ar1_bezeichnung3, ar1_apothekenpreis, ar1_händlerpreis + 0 КАК apreis ОТ artikeldaten ГДЕ ar1_artikelnummer IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?) "
ArticleDal. php в строке 39:" S0022 "
ArticleDal. php в строке 40: «[Simba] [SQLEngine] (31750) Столбец не найден: ar1_händlerpreis»
ArticleDal. php в строке 41: false
И есть пример того, что возвращает SELECT *
(я усекаю его, потому что в нем 360 столбцов ...):
0 => array:360 [▼
"ar1_artikelnummer" => "0002446"
...
"ar1_preislistenartik" => "0"
"ar1_preislistenpreis" => "0"
b"ar1_preislistenänder" => null
"ar1_preislistenprneu" => "0"
"ar1_preislistenneuab" => null
"ar1_collianz" => "1"
"ar1_tiefstpreis_brut" => "0"
"ar1_ean_nummer" => ""
"ar1_faxpreislistenar" => "0"
"ar1_inetrnetartikel" => "0"
"ar1_unterwarengruppe" => "1"
"ar1_verbot_in_stl" => "1"
"ar1_apothekenpreis" => "5.82"
b"ar1_händlerpreis" => "3.77"
...
Это странно, что эти маленькие буквы перед полем с акцент (Для ar1_händlerpreis и ar1_preislistenänder). dump () - функция отладки из Symfony framework.
Если я использую var_dump вместо dump, я получу такой результат:
["ar1_h�ndlerpreis"]=> string(4) "3.77"
Спасибо.