【问题标题】:mysqli_fetch_array failing on key due to hypen [duplicate]由于连字符,mysqli_fetch_array 在键上失败[重复]
【发布时间】:2018-02-18 21:30:18
【问题描述】:

我的一个 MySQL 列包含一个连字符。虽然通过 mysql 浏览器测试时查询工作正常,但在使用 php mysqli_fetch_array($result) 时它返回键而不是值。

我正在运行的查询如下所示:

if($test_base_name==='isolation-mer') {
    $test_name="`".$ds_channel[$i]."_isolation-mer`";
}
else {
    $test_name=$ds_channel[$i]."_isolation-mer";
}
$query="select serial_number, $test_name from table_name";
if($result=mysqli_query($dbc,$query)) {
    while($row=mysqli_fetch_arrya($result) {
       $sid=$row['serial_number'];
       $pass_fail=$row[$test_name];
       ...

序列号检索成功。但是,$pass_fail 变量总是什么都不检索。测试名称嵌入引号。即使我在各种引号中硬连线键名,它总是检索键而不是值。

这是 PHP 的旧版本,我想知道这是否是问题所在。 Perl 对此没有任何问题。

【问题讨论】:

  • "测试名称嵌入了引号。" 您需要在这里向我们展示实际查询的语法。引号到底是什么意思?像' 这样的普通人,还是打勾`?这里有两种不同的动物。
  • “这是 PHP 的旧版本,我想知道这是否是问题所在。” - 我不认为它是“恐龙”旧版本;如果您在仅发布一个函数的 mysqli_ api 下运行它,则不会。
  • 如果你在场,我想从我的要求中得到一些答案。但是,如果您留下了问题,那么如果您的问题以重复或更多的形式结束,请不要感到惊讶。然后,您将需要查阅这些并将其应用于您的代码。如果仍然失败(我倾向于怀疑),请使用旧代码下的新代码更新您的帖子,并包含任何错误,因为您有错误报告和查询mysqli_error($connection)

标签: php mysql hyphen


【解决方案1】:

PHP 将以下代码作为变量读取,而不是作为数据库列的名称:

$pass_fail=$row[$test_name];

下面的代码应该可以工作:

$pass_fail=$row['$test_name'];

【讨论】:

  • 引号嵌入在变量中。在变量名称周围放置单引号将不允许对变量进行插值。所以我认为你的例子是错误的。
  • $test_name 变量的内容包含列名。这不是问题。谢谢。
【解决方案2】:

使用 ...

select serial_number, 'isolation-noise' from table_name

表示“isolation-noise”是一个被选中的字面值,将返回一个结果集(例如)

1234,'isolation-noise'
1235,'isolation-noise'

而……

select serial_number, `isolation-noise` from table_name

使用反引号,将返回列的实际值。

更新: 做作业时——你绝对不应该在字段名中有反引号,所以

$test_name=$ds_channel[$i]."_isolation-mer";
$query="select serial_number, `$test_name` from table_name";
if($result=mysqli_query($dbc,$query)) {
    while($row=mysqli_fetch_arrya($result) {
       $sid=$row['serial_number'];
       $pass_fail=$row[$test_name];

所以这总是将反引号圆形列名称放在 select 语句中,并使用原始名称从结果集中获取数据。

【讨论】:

  • 我尝试了所有类型:单引号、双引号和反引号。 'isolation-noise' 也是表中的一列。从浏览器运行此查询工作正常。我什至尝试使用别名作为列名。
  • 能否在设置$test和构建sql语句的地方添加代码
  • 我有另一个用 Perl 编写的模块。它适用于测试名称周围的刻度。我可能没有看到微不足道的东西。
  • if($test_base_name==='isolation-mer') { $test_name="".$ds_channel[$i]."_isolation-mer"; }
  • 由于我们看不到您的完整代码,我们可能也无能为力。尽管您可能需要 $row['serial_number'] 处的引号
猜你喜欢
  • 2011-02-16
  • 2015-04-02
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
相关资源
最近更新 更多