PHP、SQL、撇号、文本输入

Posted

技术标签:

【中文标题】PHP、SQL、撇号、文本输入【英文标题】:PHP, SQL, Apostrophe, text input 【发布时间】:2015-07-04 22:29:25 【问题描述】:

由于某种原因,当我用双撇号替换撇号时,它将适用于文本视图,但不适用于常规文本输入。 (我正在使用 phpFusion)。

这是我的 html 代码

<tr class='" . $class_alt . "'>

                                    <td class='first'><input type='text' class='w_focus validate[required] text-input' size='20' name='track' id='race' value='" . $data['track'] . "' /></td>
                                    <td><input type='text' class='w_focus validate[required] text-input' size='1' name='race' id='race' value='" . $data['race'] . "' /></td>
                                    <td><input type='text' class='w_focus validate[required] text-input' size='1' name='turnip_number' id='turnip_number' value='" . $data['turnip_number'] . "' /></td>
                                    <td><input type='text' class='w_focus validate[required] text-input' size='20' name='turnip_horse' id='turnip_horse' value='" . $data['turnip_horse'] . "' /></td>
                                    <td><input type='text' class='w_focus validate[required] text-input' size='3' name='turnip_odds' id='turnip_odds' value='" . $data['turnip_odds'] . "' /></td>
                                    <td><input type='text' class='w_focus validate[required] text-input' size='10' name='turnip_bettype' id='turnip_bettype' value='" . $data['turnip_bettype'] . "' /></td>
                                    <td><input type='text' class='w_focus validate[required] text-input' size='1' name='turnip_special' id='turnip_special' value='" . $data['turnip_special'] . "' /></td>
                                    <td>
                        <div class='textarea'>
                            <textarea cols='20' rows='12' name='turnip_reason' id='turnip_reason' class='w_focus validate[required]'>" . $data['turnip_reason'] . "</textarea>
                        </div>
                    </td>
                                    <td class='last'>
                        <div class='send'><span class='button_lnk blue def_link'>
                            <input type='submit' value='Enter Tip' class='enter_tips' name='enter_tips'/>
                        </span></div>
                    </td>

                </tr>

还有我的 SQL 查询:

$find = "'";
$replace = "''";

$result = dbquery("UPDATE fusion6618n_tips SET turnip_horse='" . str_replace($find, $replace, $_POST['turnip_horse']) . "', turnip_number='" . $_POST['turnip_number'] . "', turnip_odds='" . $_POST['turnip_odds'] . "', turnip_bettype='" . str_replace($find, $replace, $_POST['turnip_bettype']) . "', turnip_special='" . $_POST['turnip_special'] . "', turnip_reason='" . str_replace($find, $replace, $_POST['turnip_reason']) . "' WHERE track='" . $_POST['track'] . "' AND race='" . $_POST['race'] . "'");

它适用于 textview (turnip_reason)。

但如果我为文本输入 (turnip_horse) 输入“Sir 'n' Sausage”,则数据库中更新的所有内容都是“Sir”而不是“Sir 'n'' Sausage”。

我不知道如何解决它。

【问题讨论】:

请阅读How can I prevent SQL-injection in PHP?。这将有助于解决您的问题。 我试过 $safe_variable = mysql_real_escape_string($_POST['chief_horse']);同样的问题,你说的是这个吗? 【参考方案1】:

您已替换转义 ' 符号,而不是将它们加倍。所以你的部分代码应该是:

$find = "'"; $replace = "\'";

因为中间的查询(简化)正在转义:

UPDATE fusion6618n_tips SET turnip_horse='Sir ''n'' Sausage' WHERE track=''

UPDATE fusion6618n_tips SET turnip_horse='Sir '

【讨论】:

以上是关于PHP、SQL、撇号、文本输入的主要内容,如果未能解决你的问题,请参考以下文章

撇号导致 Node SQL 应用程序崩溃

任何允许 Pivot 中的撇号 SQL 列别名的安全问题?

如何在 PHP“回声”中插入带有撇号和其他特殊字符的文本? [复制]

表单不会使用 PHP 将带有文件上传的文本输入发布到 SQL 表

在 PHP 中,如何创建包含引号和撇号的 mySQL 选择查询?

撇号未插入 SQL 数据库 [重复]