0

问题

我实际上正在使用 Symfony 5 进行一个新网站项目。由于我必须访问存储我们所有产品详细信息的历史数据库,因此我必须使用 AdoDb 以便我可以使用 odbc 驱动程序(因为原则不允许使用它)。

当我尝试选择带重音的字段时,查询失败并抛出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 用于网站特定的数据库。

<?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;
    }

}

此代码显示以下结果:

第 37 行的 ArticleDal.php:“选择 ar1_artikelnummer、ar2_mwststeuerschl、ar1_bestand、ar1_klassifizierung、ar1_bezeichnung3、ar1_apothekenpreis、ar1_händlerpreis + 0 AS apreis FROM artikeldaten WHERE ar1_artikelnummer IN(?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?)”

第 39 行的 ArticleDal.php:“S0022”

第 40 行的 ArticleDal.php:“[Simba][SQLEngine] (31750) 未找到列:ar1_händlerpreis”

第 41 行的 ArticleDal.php:错误

还有一个返回 a 的示例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"
...

字段前面的那些带有重音的小“b”很奇怪(对于 ar1_händlerpreis 和 ar1_preislistenänder)。dump()是 Symfony 框架的调试函数。

如果我使用 var_dump 而不是转储,我得到了这个结果:

["ar1_h�ndlerpreis"]=> string(4) "3.77"

谢谢你。

4

0 回答 0