问题
我实际上正在使用 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"
谢谢你。