$book是一个7kb的字符串.如果使用PHP PDO执行此查询exec,则monograph列(LONGTEXT)数据将被截断为6765个字符:
echo strlen($book); // output 7157
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};");
Run Code Online (Sandbox Code Playgroud)
但是,如果我打印查询并使用SQL客户端(绕过PHP)执行它,它会将所有数据插入数据库.这让我觉得PHP设置我还不熟悉.
请注意,如果我使用预准备语句(包括PDO :: PARAM_LOB),则会发生同样的情况.
$book在exec https://gist.github.com/79d5fe1050bbb0e2fac8(7157)之前转储价值.最终在数据库中的实际数据https://gist.github.com/df49d4a9707660b8b60b(6765).我不明白这样的数据截断在技术上是如何可能的,因为整个查询被传递给MySQL(否则会弹出SQL语法错误).
echo "UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};";
Run Code Online (Sandbox Code Playgroud)
如果我使用SQL客户端执行输出(https://gist.github.com/a05fe4c033e74897b82b),这是最终在数据库中的数据https://gist.github.com/88870fe26a3ae40e991e(7157,预期).
PDO使用UTF8连接启动.
new PDO('mysql:dbname=[..];host=localhost;charset=utf8', 'root', '[..]', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';"));
Run Code Online (Sandbox Code Playgroud)
更新2012年07月25日04:11美国东部时间
现在我知道这是编码问题.
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote(utf8_decode($book))} WHERE `id` = {$db->quote($c['id'])};");
Run Code Online (Sandbox Code Playgroud)
但是,我不知道该怎么办.我与MySQL的连接已经是unicode了.
/etc/my.cnf 配置为在服务器范围内使用以下设置.
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
Run Code Online (Sandbox Code Playgroud) 在我的代码中我试图将mysql_real_escape_string转换为PDO语句.有人有关于如何在PDO中编写mysql_real_escape_string的提示吗?
我在两行中使用mysql_real_escape_string:$ userName = mysql_real_escape_string($ _ POST ['username']); $ password = sha1(mysql_real_escape_string($ _ POST ['password']));
<?php
ob_start();
session_start();
include("../database/db.php");
$userName = mysql_real_escape_string($_POST['username']);
$password = sha1(mysql_real_escape_string($_POST['password']));
echo "<br>user: " . $userName;
echo "<br> pw: " . $password;
$query = "select * from tbladmin where admin_usr_name='$userName' and admin_pwd='$password'";
$res = mysql_query($query);
// $rows = $res->fetch(PDO::FETCH_ASSOC);
$rows = mysql_fetch_assoc($res);
echo "<br>numrows" . mysql_num_rows($res) . "<br>";
// $find = $query->prepare("select * from tbladmin where admin_usr_name='$userName' and admin_pwd='$password'");
// $find->execute();
// if ($find->fetchColumn() > 0) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PDO调用存储过程,但在尝试对结果进行获取时遇到以下错误.
警告:数据包乱序.预计1收到16.数据包大小= 163
我的存储过程使用两个游标,我在从临时表中选择之前关闭它.我怀疑这可能是问题因为我可以直接在MySQL中调用我的SP并且可以看到结果.在迁移到php_pdo_mysql.dll之前使用php_mysql扩展时,我也没遇到过这个SP的问题.我还可以使用PDO在PHP中调用包含INPUT参数的其他更简单的存储过程,并且可以在没有任何错误的情况下获取结果.
以下是返回错误的代码:
$db = new PDO('mysql:host='.__DB_HOST__.';dbname='.__DB_NAME__.';charset=utf8', __DB_USER__, __DB_PASS__);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
/* DOES NOT WORK */
$queryResult = $db->prepare("CALL GetResults(:siteId,null)");
$siteId = 19;
$queryResult->bindValue(':siteId', $siteId, PDO::PARAM_INT);
$queryResult->execute();
$result = $queryResult->fetchAll(PDO::FETCH_ASSOC); // returns packets out of order warning
print_r($result);
Run Code Online (Sandbox Code Playgroud)
我在Try/Catch块中有这个代码,没有抛出任何异常.实际上,PHP在浏览器中将其显示为警告.
我的存储过程签名如下所示:
CREATE DEFINER=`root`@`localhost`
PROCEDURE `GetResults`(IN siteIdParam INT(11), IN siteSearchText VARCHAR(45))
Run Code Online (Sandbox Code Playgroud)
我也不确定问题是否将null作为一个参数传递.有时第一个参数传递null,有时它是第二个.但无论它总是直接在MySQL服务器上运行.
我尝试了bindParam和bindValue,结果相同.我也可以发布我的SP但它可能有点矫枉过正.
有没有办法打开PDO扩展的其他日志记录?
任何想法或建议?如果您需要更多信息,请告诉我.
注意:我使用的是PHP v5.5.4和MySQL v5.6.14.
我有一个问题,当我使用位置参数两次时,我无法在 PDO (PHP/mysql) 中使用 SQL 语句:
SELECT `ID` FROM `_LOGIN_` WHERE `LoginName` = :loginName AND `sha512`= SHA2(CONCAT(:pw, (SELECT `salt` FROM `_LOGIN_` WHERE `LoginName` = :loginName)), 512)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我使用了两次“:loginName”。于是出现如下错误信息:
PHP Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number in ...
Run Code Online (Sandbox Code Playgroud)
我是否遗漏了某些内容,或者是否有其他方法来准备语句,以便我可以多次使用参数?
以下是重现的完整代码:
<!DOCTYPE html>
<html>
<head>
<title>pdo</title>
<meta charset = "utf-8" />
</head>
<body>
<h1>PDO Prepare</h1>
<!--
DB:
DROP DATABASE IF EXISTS `pdoTestDB`;
CREATE DATABASE `pdoTestDB`;
ALTER DATABASE `pdoTestDB` DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_general_ci';
CREATE TABLE `_LOGIN_` (
`ID` int(11) …Run Code Online (Sandbox Code Playgroud) 我正在对表执行全选 SQL 查询,并在 PHP 中准备好的查询中运行它。然后我在 json_encode 中回显结果。结果是将每个值都作为字符串,甚至是 INT 类型的行 ID。如何保留原始值类型?
$sql = "SELECT * FROM `Type`";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($result);
Run Code Online (Sandbox Code Playgroud)
输出如下:
[{"ID":"1","Type":"Classic Starters","Description":""},{"ID":"2","Type":"Special Starters","Description":""}]
Run Code Online (Sandbox Code Playgroud)
期望的输出如下:
[{"ID":1,"Type":"Classic Starters","Description":""},{"ID":2,"Type":"Special Starters","Description":""}]
Run Code Online (Sandbox Code Playgroud)
提前致谢<3