php - 似乎无法找到 SQL 语句出错的地方

标签 php mysql

我可能只是太累了,错过了一些非常简单的东西,但我想不通。

正在尝试执行以下查询:

INSERT INTO chars (charName,charClass,charLevel,charLife,charES,charInt,charStr,charDex)
VALUES (mlkauschwitz,ranger,81,4500,50,50,300,250)
ON DUPLICATE KEY UPDATE charClass=ranger,charLevel=81,charLife=4500,charES=50,charInt=50,charStr=300,charDex=250;

导致此错误:

"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'mlkauschwitz' in 'field list'"

为什么它认为一个值是一个字段?

使用以下 PHP:

include "db.php";
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$char = array(
    'charClass'=>'ranger',
    'charDex'=>'250',
    'charES'=>'50',
    'charInt'=>'50',
    'charLevel'=>'81',
    'charLife'=>'4500',
    'charName'=>'mlkauschwitz',
    'charStr'=>'300',
);
$sql = 'INSERT INTO chars (charName,charClass,charLevel,charLife,charES,charInt,charStr,charDex) VALUES ('.$char["charName"].','.$char["charClass"].','.$char["charLevel"].','.$char["charLife"].','.$char["charES"].','.$char["charInt"].','.$char["charStr"].','.$char["charDex"].') ON DUPLICATE KEY UPDATE charClass='.$char["charClass"].',charLevel='.$char["charLevel"].',charLife='.$char["charLife"].',charES='.$char["charES"].',charInt='.$char["charInt"].',charStr='.$char["charStr"].',charDex='.$char["charDex"].';';
$stmt = $conn->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
if ($stmt) {
    try {
        $stmt->execute();
    }
    catch (PDOException $e) {
        var_dump($e);
    }
}

charName 字段是唯一的/主要的。

最佳答案

结果 SQL 中的值需要被引用。 使用 pdo,你应该做这样的事情:

$sql = 'INSERT INTO chars (charName,charClass,charLevel,charLife,charES,charInt,charStr,charDex) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE charClass='.$char["charClass"].',charLevel='.$char["charLevel"].',charLife='.$char["charLife"].',charES='.$char["charES"].',charInt='.$char["charInt"].',charStr='.$char["charStr"].',charDex='.$char["charDex"].';';
$stmt = $conn->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
if ($stmt) {
    try {
        $stmt->execute(array($char["charName"],$char["charClass"],$char["charLevel"],$char["charLife"],$char["charES"],$char["charInt"],$char["charStr"],$char["charDex"]));
    }
    catch (PDOException $e) {
        var_dump($e);
    }
}

不确定确切的语法,但您可以在手册中查找。这确保 PDO 正确引用所有值,并避免 mysql 注入(inject)问题。

关于php - 似乎无法找到 SQL 语句出错的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16139694/

相关文章:

javascript - 将 HTML 代码更改为 json_encode

php - Ubuntu - Laravel 5.6 - 无法加载 ffprobe(使用 php-ffmpeg)

java - 如何截取网站的全屏截图

php - 从数据库加载消息

python - Flask mysql 查询 = 查询% self._escape_args(args, conn) TypeError : not all arguments converted during string formatting

php - 我的 PHP 生成的 CSV 文件保存为 PHP 文件

PHP 数字缩写

php - woocommerce_checkout_order_processed 钩子(Hook)执行函数两次

mysql - MySQL 连接表和使用 COUNT 函数的问题

mysql - 修剪第一个字符以匹配另一个值