PDO - SQL 在没有任何警告的情况下无法工作 [重复]

Posted

技术标签:

【中文标题】PDO - SQL 在没有任何警告的情况下无法工作 [重复]【英文标题】:PDO - SQL not working without any warning [duplicate] 【发布时间】:2016-06-16 15:17:25 【问题描述】:

我编写了一个函数来在任何数据库中插入我想要的内容:

public function insert($db, $array_label, $array_value)
    $DB = new PDO('mysql:host='.$_SESSION['mysql'][0].';dbname='.$_SESSION['mysql'][1].';charset=utf8', $_SESSION['mysql'][2], $_SESSION['mysql'][3]);

    $sql = "INSERT INTO '".$db."' (";

    for($i = 0; $i < count($array_label); $i++)
        if($i > 0)
            $sql .= ", ";

        $sql .= "'".$array_label[$i]."'";
    

    $sql .= ") VALUES (";

    for($i = 0; $i < count($array_label); $i++)
        if($i > 0)
            $sql .= ", ";

        $sql .= ":".$array_label[$i];
    
    $sql .= ")";

    $stmt = $DB->prepare($sql);
    echo '\$DB->prepare("'.$sql.'");';//DEBUG

    for($i = 0; $i < count($array_label); $i++)
        $label = ":".$array_label[$i];
        $stmt->bindParam("$label", $array_value[$i]);
        echo '</br>\$stmt->bindValue("'.$label.'", '.$array_value[$i].')';//DEBUG
    

    $stmt->execute;
    echo "</br></br>Requ&ecirc;te OK.";

然后,我像这样使用它:

$array_label = array('ID', 'ID_lang', 'ID_entry_cat', 'date', 'label', 'content');
$array_value = array($ID, $ID_lang, $ID_entry_cat, "2016-03-03 00:00:00", $label, $content);
 $DB->insert('entry', $array_label, $array_value);

经过大量测试,它可能有语法问题,但我无法弄清楚在哪里。

这是我从 echo's(//DEBUG) 中得到的:

$DB->prepare("INSERT INTO 'entry' ('ID', 'ID_lang', 'ID_entry_cat', 'date', 'label', 'content') VALUES (:ID, :ID_lang, :ID_entry_cat, :date, :label, :content)");
\$stmt->bindValue(":ID", 1)
\$stmt->bindValue(":ID_lang", 1)
\$stmt->bindValue(":ID_entry_cat", 1)
\$stmt->bindValue(":date", 2016-03-03 00:00:00)
\$stmt->bindValue(":label", dsqfsdq)
\$stmt->bindValue(":content", sdqfdsqf)

我知道有很多关于 PDO 的主题不返回错误但是: 在阅读了很多之后,它根本没有帮助我。 可以这样说:我是 PDO 的菜鸟。

我向你展示的回声就是我的函数正在做的事情。

我附上了一些我的数据库的图片以提供帮助:

PS:我省略了“日期”,但它不应该制造麻烦。我用它测试了同样的东西,它做了同样的事情:什么都没有。

【问题讨论】:

$stmt-&gt;execute; 是错字吧? 日期字段中不允许有 Null。你试图把什么放在那里?什么价值? phpMyAdmin 如果您什么都不放,请在该字段中填写一些内容。 在这种情况下您使用的是 PDO,我敢打赌它会尝试将 NULL / nothing 添加到导致它失败的字段,因为字段不允许包含 NULL 或什么都没有 即使是假日期 -> "2016-03-03 00:00:00" 也不起作用。 【参考方案1】:

尝试在异常模式下运行 PDO,然后可以捕获 PDO 异常:

$db_pdo = new PDO($db_dsn, $dbuser, $dbpassword);
$db_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// its function
$stmt->execute();

同时在 PHP 中打开错误报告以查看发生了什么

【讨论】:

感谢您的回答。不幸的是,它什么也没做:/ 用 pdo 语句尝试 catch (PDOException $e) .. do NOT try catch (PDOException $e) .. with pdo statements【参考方案2】:

将 bindparam 替换为 bindvalue,因为您正在传递该数组的值: 编辑 您还有表名和列名的引号,我用反引号替换了它们,而且您缺少用于执行的括号

 function insert($db, $array_label, $array_value)
        $DB = new PDO('mysql:host='.$_SESSION['mysql'][0].';dbname='.$_SESSION['mysql'][1].';charset=utf8', $_SESSION['mysql'][2], $_SESSION['mysql'][3]);

    $sql = "INSERT INTO `".$db."` (";

    for($i = 0; $i < count($array_label); $i++)
        if($i > 0)
            $sql .= ", ";

        $sql .= "`".$array_label[$i]."`";
    

    $sql .= ") VALUES (";

    for($i = 0; $i < count($array_label); $i++)
        if($i > 0)
            $sql .= ", ";

        $sql .= ":".$array_label[$i];
    
    $sql .= ")";

    $stmt = $DB->prepare($sql);
    echo '\$DB->prepare("'.$sql.'");';//DEBUG

    for($i = 0; $i < count($array_label); $i++)
        $label = ":".$array_label[$i];
        $stmt->bindValue("$label", "$array_value[$i]");
        echo '</br>\$stmt->bindValue("'.$label.'", "'.$array_value[$i].'")';//DEBUG
    

    $stmt->execute();
    echo "</br></br>Requ&ecirc;te OK.";

【讨论】:

bindValue() 类型我猜 也不工作:/。我不明白你为什么要放“'。和。”'所以我只更改了绑定值。 @Madz 使用此选项的回声编辑您的问题。 @Madz 我会在我的机器上测试它,等等 非常感谢,您的代码正在运行!引号是 '' 还是 "" ?抱歉,我不知道 '' 和 "" 的英文。

以上是关于PDO - SQL 在没有任何警告的情况下无法工作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 PDO 或 PHP 应用程序绑定的情况下解决二阶 SQL 注入

Xcode 7.3 - 警告未显示且无法搜索项目

无法在 phpstorm 中显示 PDO 类

MySQL:PDO事务无法正常工作

警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)

PDO 在条件不工作的情况下插入到重复键中