PHP 和 MYSQL:查询在具有值的列上返回 null

Posted

技术标签:

【中文标题】PHP 和 MYSQL:查询在具有值的列上返回 null【英文标题】:PHP and MYSQL: Query returns null on column with values 【发布时间】:2014-03-12 06:06:32 【问题描述】:

我遇到了一个简单的 SQL 查询问题:

SELECT a.idElemento, b.nombre, b.descripcion
FROM productos_elementos a
    INNER JOIN elementos_adicionales b
        ON a.idElementoAdicional=b.id_elemento_adicional
    INNER JOIN precio_elemento c
        ON a.idElemento=c.idElemento
WHERE a.idProducto = 1 AND c.idPolitica = 1

当我在我的数据库上执行这个查询时,它会返回:

IdElemento Nombre  Descripcion
    1        p1       p1_desc
    2        p2       p2_desc

但是我的 php 代码返回了这个值:

IdElemento Nombre  Descripcion
    1       null       null
    2       null       null

我不知道为什么会这样。有任何想法吗? 这是代码:

//$query is a string with the querty: SELECT....
$result = $this->conn->query($query);
$aux = $result->fetchAll(PDO::FETCH_OBJ);
$results_to_send = json_encode($aux);

如果我此时打印 $variable $results_to_send,它被初始化为:

["idElemento":"1","nombre":null,"descripcion":null,"idElemento":"2","nombre":null,"descripcion":null]

我使用这段代码中的值:

foreach ($results_to_send as $key => $value)
...
echo $value->idElemento //It prints 1 or 2
...
echo $value->nombre //It is null
...

更新: 最后我发现了问题。我还不知道如何解决它,但这是一个开始。

问题是存储在数据库中的字符串。两列都有带重音的字符。例如第一行是:(1,p1_náme, p1_désc)。它返回 (1, null, null)

如果我将其更改为 (1,p1_name, p1_desc),它将返回 (1,p1_name, p1_desc)。

更新日期 2: 由于 Andrew Mackrodt 的评论解决了问题^^

【问题讨论】:

发布您用于获取数据的 php 代码。 是的,你漏掉了出错的部分。我敢打赌,您正在尝试将值作为数组回显,但您将其作为对象获取。 包含您要打印结果的代码。 嗯,所以打印没有问题。 Nombre 和 Description LOB 或其他字段 FETCH_OBJ 可能有问题吗? 您对这些列使用什么排序规则?例如。如果您使用utf8_general_ci,您可能需要为连接设置字符排序规则:$this->conn->exec('SET NAMES utf8');。或者,最好在连接字符串"mysql:host=$host;dbname=$dbname;charset=utf8"中设置字符排序规则。 【参考方案1】:

我遇到了同样的问题,这是由 PHP 的 MySQLI 和 MySQL 数据库之间的字符集不匹配引起的。并非所有字符集都具有相同的字符,这会导致 PHP 返回 null。

您可以通过定位您的数据库字符集(在 phpmyadmin 或类似 this 的查询中)来比较和设置您的字符集,并在 PHP 中使用 $mysqli::set_charset("short_name") (http://php.net/manual/en/mysqli.set-charset.php) 进行设置

如果您想查看可用的字符集,请参阅此处的列表。 http://dev.mysql.com/doc/refman/5.6/en/charset-charsets.html

【讨论】:

【参考方案2】:

对于 PDO,只需这样做:

$db = new PDO("mysql:host=host.address.com.br; dbname=yourdb; charset=utf8;", "username", "password");
$db->exec("set names utf8");

别忘了将 Collat​​ion 也定义为 utf8。

见this answer

【讨论】:

以上是关于PHP 和 MYSQL:查询在具有值的列上返回 null的主要内容,如果未能解决你的问题,请参考以下文章

具有重复值的列上的数据库索引

在另一列上复制在某些条件下具有空值的列

如何在具有空值的列上使用`jsonb_set`

是php-mysql:根据涉及PHP变量的条件更新具有不同值的列

CHAR类型列上具有相等谓词的查询中没有返回数据[关闭]

如何在laravel中使用逗号分隔值的列上使用'where'