MySQL返回PDO占位符名称

22 浏览
0 Comments

MySQL返回PDO占位符名称

有一个类似的帖子,但没有解决方案。

以下代码导致MySQL查询包含占位符名称:

$the_image_itself = "abcde123def.jpg";

$title = "一本书";

$description = "一些阅读材料";

$the_image_itself = "%".$the_image_itself;

$stmt = $db->prepare("UPDATE nky_posts SET `post_title`=:title, `post_content`=:description WHERE `guid` LIKE :the_image_itself");

$stmt->bindParam(':title', $title);

$stmt->bindParam(':description', $description);

$stmt->bindValue(':the_image_itself', $the_image_itself, PDO::PARAM_STR);

$stmt->execute();

$stmt->debugDumpParams();

echo "


";

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

$affected_rows = $stmt->rowCount();

结果如下:

开始SQL:[105] UPDATE nky_posts SET `post_title`=:title,

`post_content`=:description

WHERE `guid` LIKE :the_image_itself

Params: 3 Key:

Name: [6]

:title paramno=-1

name=[6] ":title"

is_param=1 param_type=2

Key: Name: [12] :description

paramno=-1 name=[12] ":description"

is_param=1 param_type=2

Key: Name: [17] :the_image_itself paramno=-1

name=[17] ":the_image_itself"

is_param=1 param_type=2

这是对象调用:

try{

$db=new PDO('mysql:host=localhost;dbname=viewingr_ssdevwp; charset=utf8',$db_username,$db_password);

}

catch(PDOException $e){

echo '连接到MySQL时出错!:'.$e->getMessage();

exit();

}

0
0 Comments

问题的原因是MySQL不返回PDO占位符的名称,而是返回占位符的位置。这是由于debugDumpParams函数只显示SQL文本以及占位符名称/位置和它们各自的数据类型,但不显示绑定参数的值。

解决这个问题的方法是注意以下几点:

- 不需要在stmt上调用fetchAll方法,因为它是一个UPDATE语句。

- 注意rowCount方法,MySQL返回的是实际被语句修改的行数,而不是匹配的行数。即如果被设置的列的值已经等于指定的值,MySQL不会将该行视为受影响的行。

- 检查占位符是否正确传递了值给MySQL。即使使用简单的SELECT语句,如$stmt = $db->prepare("SELECT * FROM nky_posts WHERE 'post_title'=:title"),如果返回null,则表示占位符没有正确传递值。在WHERE子句中使用实际数据时,会正确返回数据。

因此,要解决这个问题,我们需要注意MySQL返回PDO占位符位置而不是名称,以及确保占位符正确传递值给MySQL。

0
0 Comments

问题的出现的原因是在占位符的值中发现了一个神秘的<br/>,并且通过substr($var, 0, -6)将该异常值从变量中删除,直到注意到在填充变量的行末尾无意中连接了一个<br/>,可能是在删除用于测试的输出代码行时意外发生的。

解决方法是按照以下步骤进行确认每个步骤都起作用:

  1. 创建一个没有WHERE或占位符的简单SELECT语句:

    $sql = "SELECT * FROM nky_posts";
    

  2. 使用一个已知存在于数据库中的文字变量,添加一个使用"="(而不是LIKE)的WHERE子句:

    $the_image = "image_url_from_phpMyAdmin";
    $sql = "SELECT post_title FROM nky_posts WHERE guid = $the_image";
    

  3. 将文字变量替换为一个包含已知值的单个占位符:

    $the_image = "image_url_from_phpMyAdmin";
    $stmt->bindParam(':the_image', $the_image, PDO::PARAM_STR);
    $sql = "SELECT post_title FROM nky_posts WHERE guid = :the_image";
    

  4. 使用LIKE替换"="(记得将占位符变量与"%"连接起来):

    $the_image = "%" . $the_image . "%";
    $stmt->bindParam(':the_image', $the_image, PDO::PARAM_STR);
    $sql = "SELECT post_title FROM nky_posts WHERE guid LIKE :the_image_itself";
    

  5. 将"已知"变量替换为动态变量(在此情况下来自XML结果):

    basename($oBookNode->getElementsByTagName('actual-link')->item(0)->nodeValue);
    

    (使用basename()函数从URL字符串中返回仅图像名称,该字符串在wordpress数据库中)

  6. 最后,将SELECT语句替换为UPDATE语句,并添加两个额外的占位符来保存要插入的变量。最终代码:

    $sql = "UPDATE nky_posts SET post_title=:title, post_content=:description WHERE guid LIKE :the_image";
    $stmt = $db->prepare($sql);
    //foreach循环从这里开始
    foreach ($oDOM->getElementsByTagName('item') as $oBookNode)
    {
    $the_image = basename($oBookNode->getElementsByTagName('actual-link')->item(0)->nodeValue);
    $title = $oBookNode->getElementsByTagName('title')->item(0)->nodeValue;
    $description = $oBookNode->getElementsByTagName('actual-content')->item(0)->nodeValue;
    //将%连接到变量以用于LIKE子句(可能只在这种情况下需要第一个,但是...)
    $the_image = "%" . $the_image . "%";
    $stmt->bindParam(':title', $title, PDO::PARAM_STR);
    $stmt->bindParam(':description', $description, PDO::PARAM_STR);
    $stmt->bindParam(':the_image_itself', $another_image_itself, PDO::PARAM_STR);
    $stmt->execute();
    //结束foreach循环
    }
    

    感谢大家的帮助。

0
0 Comments

MySQL returning PDO placeholder names这个问题的出现的原因是使用debugDumpParams()方法无法显示原始的SQL查询语句。在使用参数化查询时,创建了一个准备好的语句,然后只发送参数值,它们并不是一起发送的,这意味着无法打印原始的SQL查询语句。debugDumpParams()方法只会显示参数列表、参数名、参数类型等,但不会显示参数的值。然而,可以检查MySQL查询日志来查看执行的原始SQL查询语句。

解决方法是找到查询日志,并使用以下命令查看最近执行的查询(前提是有SSH访问权限):

$ sudo tail -f /usr/local/mysql/data/yourQueryLog.log

上述路径只是一个示例,实际路径可能在您的系统上不同。

此外,如果使用MySQL数据库,默认情况下,PDO会使用模拟准备语句的方式与MySQL一起使用。要获取实际的“服务器端”准备语句,需要显式设置PDO选项:

setAttribute(PDO::ATTR_EMULATE_PREPARES,false)

如果使用phpMyAdmin,可以参考这个答案来启用查询日志:http://stackoverflow.com/a/14404000/1438393

0