相关疑难解决方法(0)

为什么SUM(`column`)返回一个字符串而不是一个整数?

我正在使用Laravel并且有一个选择使用DB::raw() SUM()列的查询:

DB::raw("SUM(points) as game_points")

我已经安装了mysqldn和AFAIK Laravel使用的PDO.

game_points无论列的类型是什么,都是一个字符串.(这是一个整数列)

如果我这样做:

DB::raw("COUNT(id) as foo_bar")

foo_bar 以整数形式返回.

php mysql pdo

8
推荐指数
1
解决办法
2756
查看次数

为什么 PDO::ATTR_EMULATE_PREPARES => TRUE 将所有值作为字符串返回

这是有点共同的知识与不同版本的PHP和MySQL,并通过使用本地预处理语句或模拟预处理语句,可以有natine值类型或没有,像这样:

$value = $db->query("SELECT 1033 AS Code")->fetch(PDO::FETCH_COLUMN)
$value2 = $db->query("SELECT '1033' AS Code")->fetch(PDO::FETCH_COLUMN);

//PDO::ATTR_EMULATE_PREPARES set to true:
var_dump($value); // string(4) "1033"
var_dump($value2); // string(4) "1033"

//PDO::ATTR_EMULATE_PREPARES set to false:
var_dump($value); // int(1033)
var_dump($value2); // string(4) "1033"
Run Code Online (Sandbox Code Playgroud)

这篇文章:

问题是 PDO 由于类型转换为字符串而导致 zval-separation。转换由 PDO 核心请求。

默认情况下,PDO 将始终将数据转换为字符串,并且 PDO_MYSQL 驱动程序只能通过返回 zval 来解决此 PDO 默认值。

为什么 PDO 总是将数据转换为字符串?

php mysql pdo

5
推荐指数
1
解决办法
1792
查看次数

如何从 SQLite 和 PDO 返回一个整数?

编辑。这个问题属于 SQLite 而不是 MySQL。

请注意,以下查询返回 string(3) "123",而不是整数。

$db = new \PDO("sqlite:".__DIR__."/db/trends.db");
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

$stmt=$db->prepare('INSERT INTO trends(timestamp,data) VALUES (?,?)');
$stmt->execute([123,'Hello']);
$stmt=$db->prepare('SELECT timestamp FROM trends WHERE data=?');
$stmt->execute(['Hello']);
var_dump($stmt->fetchColumn()); // string(3) "123"
Run Code Online (Sandbox Code Playgroud)
$db = new \PDO("sqlite:".__DIR__."/db/trends.db");
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

$stmt=$db->prepare('INSERT INTO trends(timestamp,data) VALUES (?,?)');
$stmt->execute([123,'Hello']);
$stmt=$db->prepare('SELECT timestamp FROM trends WHERE data=?');
$stmt->execute(['Hello']);
var_dump($stmt->fetchColumn()); // string(3) "123"
Run Code Online (Sandbox Code Playgroud)

php sqlite pdo

5
推荐指数
0
解决办法
642
查看次数

在 Doctrine 2 ORDER BY 中使用 DQL 函数

我正在使用 MySQL 数据库在 Symfony 2.3 和 Doctrine 2.4 中做一个项目。

我有一个 FieldValue 实体(简化):

class FieldValue
{
    /**
     * The ID
     *
     * @var integer
     */
    protected $fieldValueId;

    /**
     * Id of associated Field entity
     *
     * @var integer
     */
    protected $fieldId;

    /**
     * Id of associated user
     *
     * @var integer
     */
    protected $userId;

    /**
     * The value for the Field that user provided
     *
     * @var string
     */
    protected $userValue;

    /**
     * @var \MyProjectBundle\Entity\Field
     */
    protected $field;

    /**
     * @var …
Run Code Online (Sandbox Code Playgroud)

php mysql sql-order-by symfony doctrine-orm

4
推荐指数
1
解决办法
7509
查看次数

当准备好的语句的占位符在子查询中时,"字段列表中的未知列"

我在Ubuntu 14.04 LTS上使用PHP 5.5.9和MySQL 5.5.44以及mysqlnd 5.0.11-dev.以下声明未能准备:

$db->prepare("SELECT nr.x FROM (SELECT ? AS x) AS nr")
Run Code Online (Sandbox Code Playgroud)

尽管以下声明成功准备,但这是事实:

$db->prepare("SELECT nr.x FROM (SELECT '1337' AS x) AS nr")
Run Code Online (Sandbox Code Playgroud)

是什么导致这种差异?手册说"参数标记只能在数据值出现的地方使用,而不能用于SQL关键字,标识符等等." 但这是一个数据值.

不是PDO的错

在独立客户端中也会发生同样的事情:

mysql -uredacted -predacted redacted
-- Type 'help;' or '\h' for help.
SELECT nr.x FROM (SELECT '1337' AS x) AS nr;
-- x
-- 1337
-- 1 row in set (0.00 sec)
PREPARE workingstmt FROM 'SELECT nr.x FROM (SELECT ''1337'' AS x) AS nr';
-- Query OK, 0 rows affected …
Run Code Online (Sandbox Code Playgroud)

php mysql pdo prepared-statement

3
推荐指数
1
解决办法
768
查看次数