PHP/MYSQL - 与通过 php 添加到 mysql 表相关的令人困惑的代码块


PHP/MYSQL - Confusing code block relating to additions to a mysql table via php

有人能告诉我为什么在我的脚本中运行以下代码块时会触发错误,但是当直接通过 php myadmin 尝试 sql 查询时,没有问题。

脚本中运行着一个 mysql 连接。

// Generate a random key and add details to specials table
$email = $_POST['specials'];
$randomKey = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',12)),12);
$sql = "
    INSERT INTO specials SET
    id='',
    email='$email',
    verified='0',
    `key`='$randomKey',
    timestamp=NOW()
";
if (!mysqli_query($link, $sql))
{
    $error = 'Error adding email address to specials table.';
    include "$docRoot/html/main/error.html.php";
    exit();
}

我很确定我已经正确编码了这个,在我进行跟踪和错误测试会议之前,我认为可以简要地看一下这个,并告诉我他们是否发现了任何可能躲避我的明显错误。

感谢您抽出宝贵时间通读本文!

编辑:

使用以下代码:

if (!mysqli_query($link, $sql12))
{
    echo mysqli_error();
    $error = 'Error adding email address to specials table.';
    include "$docRoot/html/main/error.html.php";
    exit();
}

我得到以下输出:

Warning: mysqli_error() expects exactly 1 parameter, 0 given in /serveraddress/includes/inc/assistors/controllers.inc.php on line 161

试试这个看看它到底返回了什么

$result = mysqli_query($link, $sql);
var_dump($result);

您能否检查是否有任何字段是数字的?您正在发送每个字符数据,因此这可能是SQL失败的原因。

既然你提到ID是一个INT,那么请使用下面修改后的代码:

// Generate a random key and add details to specials table
$email = $_POST['specials'];
$randomKey = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',12)),12);
$sql = "
    INSERT INTO specials SET
    id=0,
    email='$email',
    verified=0,
    `key`='$randomKey',
    timestamp=NOW()
";
if (!mysqli_query($link, $sql))
{
    $error = 'Error adding email address to specials table.';
    include "$docRoot/html/main/error.html.php";
    exit();
}

''表示空白字符串,MySQL无法成功地将空白字符串转换为INT类型的数字,因此它使您的SQL INSERT命令失败。因此,您需要发送0或者如果您的 ID 列允许NULL那么您也可以发送NULL。但是发送''会产生错误。

这里需要注意的一点是,您发送给已验证'0'不会触发错误,因为'0'成功转换为0因此MySQL对此没有问题。

当您尝试将''即空白字符串保存到 ID 列时生成错误。