【问题标题】:mysqli_real_escape_string makes empty stringmysqli_real_escape_string 生成空字符串
【发布时间】:2014-03-02 02:13:19
【问题描述】:

我有这个脚本。

<?php  
session_start();
if (!isset($_POST['text']) || $_POST['text'] == "" || strlen($_POST['text']) < 5) {
echo "error";
echo '<meta http-equiv="refresh" content="2;url=../prispevky/add.php">';
return 0;}
else $text = $_POST['text'];

if (!isset ($_SESSION['nick'])) {
echo "error";
echo '<meta http-equiv="refresh" content="2;url=../error.php">';
return 0;}
else $nick = $_SESSION['nick'];

$time = time();

$farby = array("red","blue","green", "brown", "orange", "purple", "grey", "lime", "yellow", "pink");
include_once "../inkludy/conect.php";
$new = $_POST['text'];
echo $new;
$new = mysqli_real_escape_string($_POST['text']);
echo $new;

$new = str_replace(array("\\r\\n", "\n"), "</br>", $new);
for ($i=0;$i<10;$i++){
if (preg_match ('/&lt; .{1,10} &gt;/', $new, $meno)){
    $nove_meno = preg_replace('/(&lt; )|( &gt;)/', '', $meno[0]);
    $new = preg_replace('/' . $meno[0] . '/', '<b style="color:' . $farby[$i] . '">>' . $nove_meno . '<</b>', $new);
}
}

    try {
    $query = "INSERT INTO hlasky (autor,text,onoff,time) VALUES (:nick,:new,:onoff,:time)";
    $stmt = $conn->prepare($query);
    $stmt->bindValue(':nick', $nick, PDO::PARAM_STR);
    $stmt->bindValue(':new', $new, PDO::PARAM_STR);
    $stmt->bindValue(':onoff', '1', PDO::PARAM_INT);
    $stmt->bindValue(':time', $time, PDO::PARAM_INT);
    $stmt->execute();}

catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();}
?>
<meta http-equiv="refresh" content="10;url=../hmenu/najn.php">

$_POST = "asdasd" 和

$new = $_POST['text'];
echo $new;

工作正常,但和 asdasd 但相呼应

$new = mysqli_real_escape_string($_POST['text']);
echo $new;

使 $new 为空。每个人都认为我没有 mysql 连接,但我有并且

INSERT INTO hlasky (autor,text,onoff,time) VALUES (:nick,:new,:onoff,:time) 

也可以,但是 :new 是空的 你能帮我如何不松开 $new 字符串吗?

这是包含在 include_once "../inkludy/conect.php" 中的我的连接脚本;

<?php
$server = "localhost";
$username = "";
$password = "";
$databaza_meno = "iz";

$dsn = "mysql:unix_socket=/tmp/mysql50.sock;dbname=$databaza_meno";
$conn = new PDO($dsn, $username, $password);

$db_spojenie = mysql_connect($server, $username, $password);
$db = mysql_select_db($databaza_meno, $db_spojenie);
mysql_query("SET NAMES utf-8");
?>

【问题讨论】:

  • 您不应该将 *real_escape_string 与 PDO 一起使用。哦,你把 mysql 和 mysqli 和 pdo 混合在一起
  • 你为什么要混合mysql_*和PDO?
  • @OdkoPP 您使用 PDO mysqli,而不是两者。然后使用准备好的语句,忘记转义字符串。
  • 所以我可以删除 real_escape_string 并只使用 PDO 吗?
  • @OdkoPP 是的,你可以这样做。尝试谷歌搜索“pdo 准备语句教程”并从那里开始。

标签: php mysql sql pdo


【解决方案1】:

解决方案是删除 mysqli_real_escape_string 并仅使用 PDO,因为准备好的语句提供自动转义。

【讨论】:

    【解决方案2】:

    我相信您在调用mysqli_real_escape_string 时需要指定一个链接。我不经常使用 PDO,但我相信由于您的链接 $conn 在 PDO 中,如果您想使用任何以 mysqli 开头的函数,则需要使用 mysqli_connect 指定一个新链接。

    mysqli_real_escape_string 的文档在这里:http://us2.php.net/manual/en/mysqli.real-escape-string.php

    【讨论】:

    • 如果使用 PDO,则不要使用 *_real_escape_string
    • 但问题是关于 mysqli_real_escape_string,而不是 PDO。
    • @SethRachwitz 您使用其中之一,但不能同时使用。实际上,如果您想获得技术知识,该问题包含所有三个 mysql API。
    • 我希望看到 addlashes 用于卫生 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多