撇号不发送到数据库

时间:2014-08-24 21:01:06

标签: php html mysql

我需要你的帮助。今天我看到,如果我把'(撇号)放在某些单词中,那么这个文本将不会发送到数据库。我试图删除htmlentiteshtmlspecialchars但没有帮助。请帮我解决这个问题。谢谢。 hier是profile.php

<?php
if(logged_in() === true){
    if(empty($_POST['status']) === false && empty($_POST['user_status']) === false){
        $status_data = array(
            'body' => $_POST['status'],
            'added_by' =>$user_data['username'],
            'date_added' => date('Y-m-d H:i:s'),
            'user_posted_to' =>  $_GET['username'],
            'user_id' => $user_data['user_id']
        );
        update_status($id, $status_data, $user_id);
    }
?>
<form class="forma" action="<? echo $username; ?>" method="post" accept-charset="utf8">
    <div class="field">

        <label for="Status" style="color: #7f7f7f; font-family: Cambria, Hoefler Text, Liberation Serif, Times, Times New Roman, serif;"></label>
        <textarea rows="4" cols="50" name="status" placeholder="say something" id="status_area" charset="UTF-8" style=".value:black;"></textarea>
        <div class='fild_bottom'>
            <input name="user_status" type="submit" value="Post" id="button">
        </div>
    </div>
</form>

以下是function.php

function update_status($id, $status_data, $user_id){
    $query = @mysql_query('set character_set_results = "utf8"');
    $user_id = mysql_query("SELECT * FROM users WHERE user_id = $user_id");

    array_walk($status_data, 'array_sanitize');

    $fields  = '`' . implode('`,`', array_keys($status_data)) . '`';
    $bank ='\'' . implode('\', \'', $status_data) . '\'';

    mysql_query("INSERT INTO `status` ($fields) VALUES ($bank)");
}
function array_sanitize($item){
    $item = htmlentities(strip_tags(mysql_real_escape_string($item)));
}

function sanitize($data){
    return htmlspecialchars(strip_tags(mysql_real_escape_string($data)));
}

1 个答案:

答案 0 :(得分:2)

请将您的代码更改为PDO。举个例子,我引用了这个SO Question

将您的函数update_status更改为此(它暗示您已经建立了数据库连接($ db中的对象)):

/* $user_id is unused, you should think about removing it */
function update_status($id, $status_data, $user_id) {
    global $db;

    $link = $db->prepare("INSERT INTO `status` (`body`, `added_by`, `date_added`, `user_posted_to`, `user_id`) VALUES (?, ?, ?, ?, ?)");
    $link->bindvalue(1, $status_data['body']);
    $link->bindvalue(2, $status_data['added_by']);
    $link->bindvalue(3, $status_data['date_added']);
    $link->bindvalue(4, $status_data['user_posted_to']);
    $link->bindvalue(5, $status_data['user_id']);
    $link->execute();
}

删除函数array_sanitize()和sanitize(),你再也不需要它们了(感谢PDO和Prepared Statements)。如果键始终相同且已知,则无需在$ status_data数组上使用array_keys。

我不知道为什么你在这个功能中再次选择user_id,因为你已经在$ status_data中获得了它。

编辑:将其放在一个中心文件中(您可以在try {之前设置变量,也可以用正确的值替换它们):

try {
    $db = new PDO("mysql:host=".$host.";dbname=".$db.";charset=utf8", $user, $password);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //Stops emulating Prepared Statements
} catch(PDOException $e) {
    die("Unable to connect. Error: ".$e->getMessage());
}