Php 带有转义字符的mySQLi Prepared语句Select

Php 带有转义字符的mySQLi Prepared语句Select,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我试图使用准备好的语句从mySQL表中进行选择。select准则是用户表单输入,所以我绑定这个变量并使用准备好的语句。代码如下: $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']);

我试图使用准备好的语句从mySQL表中进行选择。select准则是用户表单输入,所以我绑定这个变量并使用准备好的语句。代码如下:

$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_name表中是否已经存在first_name。如果是,则返回相应的ID first\u name\u ID。否则,代码会将新的first\u name插入first\u names表并获取insert\u ID

问题是当用户输入带有转义字符“Henry’s”的名称时。不太可能是直呼其名,但肯定是雇主。发生这种情况时,代码不会在日志文件中执行任何选择或插入活动。因此,由于变量中有转义字符,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行可能是脚本正在消亡的地方


非常感谢您的帮助。

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


签出此

为什么要将mysqli对象存储在$\u会话中?我建议您在开发时启用更高级别的错误报告。将此粘贴在脚本顶部;ini_设置“显示错误”、“打开”;错误报告全部;我正在使用会话变量,包括为mysqli对象使用会话变量,因为这样我就不必将变量传递给函数或从一个页面传递给另一个页面,我现在已经这样做了…使用准备好的语句和绑定参数可以消除特定于DB的转义mechanisms@DavidChan好像菲尔的评论不够真实,你建议使用mysql\u real\u escape\u string,而OP显然使用mysqli。是的,我认为使用准备好的语句和绑定参数的整个想法是为了完全避免转义机制的需要。。。。