Невозможно выбрать имя столбца, содержащее ударение - PullRequest
0 голосов
/ 05 августа 2020

Проблема

На самом деле я работаю над новым проектом веб-сайта с 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"

Спасибо.

...