2013-04-07 62 views
0

我问这个问题是因为我一直在墙上敲打我的头,因为这个东西很可能有一个简单的解决方案。我的问题是,我试图选择一个包含类似于“ss & 246i”的唯一ID的记录。如果声明不包含&符号,它将返回正常,但如果它有一个,我不会得到任何回报。这里是我的代码恭维我的问题:PDO select语句中的特殊字符

<?php 
@session_start(); 

if (isset($_POST['code'])) { 
    $id = $_POST['code']; 
    $db = new PDO('mysql:host=localhost;dbname=example', 'example', '******'); 
    $db->exec("SET CHARACTER SET utf8"); 

    $sql = "SELECT * FROM tbl_human_readable WHERE unique_id = :id LIMIT 1"; 
    $stmt = $db->prepare($sql); 
    $stmt->bindValue(":id", $id); 
    try { 
     $stmt->execute(); 
    } catch (PDOException $e) { 
     echo $e->getCode() . " - " . $e->getMessage(); 
    } 

    $return = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    var_dump($return); 
    if ($return) { 
     $_SESSION['code'] = $id; 
     echo "success"; 
    } else { 
     echo "failed"; 
    } 
} else { 
    echo "failed"; 
} 

一如往常在这个任何帮助是非常赞赏

+0

您的查询似乎对我无用,无论选择了什么ID。你正在学习什么教程?无论如何,没有特殊字符可能会影响PDO查询。所以,你的问题在别的地方。很可能有一些编码问题或一些无用的“消毒”功能。 – 2013-04-07 03:59:53

+1

在查询中将'':id''更改为':id' - 引用由'prepare'完成。 – 2013-04-07 04:03:04

+0

呃......用单引号贴出来并不是故意的。因为它们不需要,所以将它们从SELECT语句中移除。任何想法为什么它不可用?它的作用是减去&字符。 – Cameeob2003 2013-04-07 04:04:45

回答

3

在解决问题,程序员必须使用知识经验

知识会告诉他没有特殊字符会影响格式正确的PDO查询。
所以,现在是时候尝试一些经验。意味着一个人不只是盯着代码,而是运行它。为了验证假设的目的。

你假设$ _POST ['code']包含文字ss&246i值。但是你不知道它是否真实 - 你从来没有验证过它。因此,您必须在脚本中放置验证码才能确定。

你假设数据库包含文字ss&246i值。但是你不知道它是否真实 - 你从来没有验证过它。所以,你必须运行一些代码来验证这个假设 - 试着选择一个硬编码的文字值而不是张贴一个。

这样一个接一个地验证你所有的假设并找出哪些假设是假的。所以,你可以自己解决问题,或者在Stack Overflow上提出一个有意义的问题。

上述过程被称为调试并且是程序员的工作的重要组成部分。

+0

我接受,考虑到它明显的答案= P。在48小时内没有睡眠紧张的时间,所以逻辑调试步骤似乎已经下滑了。常识必须具备,因为很明显,正确地调试代码会让我知道我在找什么。 – Cameeob2003 2013-04-08 23:10:01