mySQLi准备语句选择转义字符

时间:2012-01-12 06:05:02

标签: php mysqli prepared-statement

我正在尝试使用预准备语句从mySQL表中进行选择。 select critera是用户表单输入,所以我绑定了这个变量并使用预处理语句。以下是代码:

$sql_query = "SELECT first_name_id from first_names WHERE first_name = ?";
$stmt = $_SESSION['mysqli']->prepare($sql_query);

    $stmt->bind_param('s', $_SESSION['first_name']);
    $stmt->execute();
    $stmt->store_result();

    if ($stmt->num_rows == '1') {
            $stmt->bind_result($_SESSION['first_name_id']);
            $stmt->fetch();
    } else {
            $stmt->close();
            $sql_query = "INSERT INTO first_names (first_name) VALUES (?)";
            $stmt = $_SESSION['mysqli']->prepare($sql_query);
            $stmt->bind_param('s', $_SESSION['first_name']);
            $stmt->execute();
            $_SESSION['first_name_id'] = $_SESSION['mysqli']->insert_id;
    }
    $stmt->close();

显然,我的代码只是确定first_names表中是否已经存在first_name。如果是,则返回相应的ID(first_name_id)。否则,代码将新的first_name插入first_names表并获取insert_id。

问题是用户输入带有转义字符的名称('Henry')。不太可能有名字,但肯定是雇主。发生这种情况时,代码不会执行(日志文件中没有选择或插入活动)。因此,由于变量中存在转义字符,似乎mySQL忽略了代码。

如何解决此问题?我的代码高效且正确吗?

问题#2。然后代码继续进行另一次插入或更新,如下面的代码所示:

if (empty($_SESSION['personal_id'])) {
            $sql_query = "INSERT INTO personal_info (first_name_id, start_timestamp) VALUES (?, NOW())";
    } else {
            $sql_query = "UPDATE personal_info SET first_name_id = ? WHERE personal_info = '$_SESSION[personal_id]'";
    }

    $stmt = $_SESSION['mysqli']->prepare($sql_query);
    $stmt->bind_param('i', $_SESSION['first_name_id']);
    $stmt->execute();

    if (empty($_SESSION['personal_id'])) {
            $_SESSION['personal_id'] = $_SESSION['mysqli']->insert_id;
    }
    $stmt->close();

上面代码的问题是我无法让它工作。我不确定是否与脚本的第一部分存在冲突,但我已经尝试了一切以使其工作。没有PHP错误,并且此代码中的mySQL日志文件中没有显示插入或更新。似乎代码中的bind_param行可能是脚本死亡的地方......

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:-1)

在将用户输入发送到数据库之前,您应该验证/转义用户输入。

结帐mysql-real-escape-string()