【问题标题】:PHP not inserting data into MySQLPHP没有将数据插入MySQL
【发布时间】:2026-01-28 02:00:01
【问题描述】:

我查看了其他帖子并尝试了一些建议,但我似乎仍然无法在我的数据库中填充特定的表。

我将提供一些我的代码块来透视事物。

这是我创建要填充数据的表的代码:

    CREATE TABLE `Devices` (
      `dID` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `deviceType` enum('BT','C1','AW') DEFAULT NULL COMMENT 'BT = Bluetooth, C1 = C1     Reader, AW = Acyclica Wifi',
      `deviceName` varchar(255) NOT NULL DEFAULT '',
      `deviceIP` varchar(15) NOT NULL DEFAULT '',
      `devicePort1` int(4) NOT NULL,
      `devicePort2` int(4) DEFAULT NULL,
      `deviceRealLatitude` float(10,6) NOT NULL,
      `deviceRealLongitude` float(10,6) NOT NULL,
      `deviceVirtualLatitude` float(10,6) DEFAULT NULL,
      `deviceVirtualLongitude` float(10,6) DEFAULT NULL,
      `deviceChanged` tinyint(1) DEFAULT NULL,
      `deviceStatus` tinyint(1) DEFAULT NULL,
      `deviceLastSeen` timestamp NULL DEFAULT NULL,
      `deviceBufferSize` int(4) DEFAULT NULL,
      `deviceSoftwareVersion` varchar(20) DEFAULT NULL,
      `deviceMacAddress` varchar(17) DEFAULT NULL,
      `deviceTest` tinyint(1) DEFAULT NULL,
      `deviceAPIKey` varchar(100) DEFAULT NULL COMMENT 'Only used with the Acyclia   Scanners',
      `deviceSerialID` int(6) DEFAULT NULL COMMENT 'Only used with the Acyclia  Scanners',
       PRIMARY KEY (`dID`)
      ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;

我已经声明了所有字段变量,即

 $dID = 0;
 .....
 $deviceSerialID = 0;

我检查了每个字段是否已设置,即

isset($_POST['dID']) == 1 ? ($dID = ($_POST['dID'])) : null;
.....
isset($_POST['deviceSerialID'])   == 1 ? ($deviceSerialID = ($_POST['deviceSerialID']))     : null;

这里是我使用 INSERT INTO "表名" --> VALUES

$insert_query = "INSERT INTO Devices (`dID`, `deviceType`, `DeviceName`, `deviceIP`,
`devicePort1`, `devicePort2`, `deviceRealLatitude`, `deviceRealLongitude`,
`deviceVirtualLatitude`, `deviceVirtualLongitude`, `deviceChanged`, `deviceStatus`,
`deviceLastSeen`, `deviceBufferSize`, `deviceSoftwareVersion`, `deviceMacAddress`,
`deviceTest`, `deviceAPIKey`, `deviceSerialID`) VALUES ('".$dID."', '".$deviceType."',
'".$deviceName."', '".$deviceIP."', '".$devicePort1."', '".$devicePort2."', 
'".$deviceRealLatitude."', '".$deviceRealLongitude."', '".$deviceVirtualLatitude."', 
'".$deviceVirtualLongitude."', '".$deviceChanged."', '".$deviceStatus."', 
'".$deviceLastSeen."', '".$deviceBufferSize."', '".$deviceSoftwareVersion."', 
'".$deviceMacAddress."', '".$deviceTest."', '".$deviceAPIKey."', 
'".$deviceSerialID."')";

mysqli_query($conn,$insert_query);

现在,在我的 html 表单中,我只想为某些字段输入数据:

<fieldset>
<form name = "form1" id = "form1" action = "" method = "post">
Device ID:         <input type="text" name="dID"        >               <br>

Device Type:              <select name="deviceType">                    
              <option value = "BT">BT</option>
              <option value = "C1">C1</option>
              <option value = "AW">AW</option>  
              </select>                                             <br>

Device Name:       <input type="text" name="deviceName" >               <br>
Device IP:         <input type="text" name="deviceIP"   >               <br>
Device Port 1:         <input type="text" name="devicePort1">               <br>
Device Port 2:         <input type="text" name="devicePort2">               <br>

<input type = "submit" name = "submit" value = "submit" />
</fieldset>
</form>

当我输入我的数据并点击提交时,我没有收到任何错误。我意识到我在代码中所做的一些事情是不必要的,例如刻度线。这一切都是试图看看它是否能解决我的问题。关于我能做什么的任何建议?

2014 年 6 月 20 日更新

似乎问题在于我的 CREATE TABLE 语法。当我用“varchar”替换类型“int”或“float”时,对于字段(dID 是一个例外),它会更新表。任何熟悉发布“int”或“float”值的人?

几个小时后,2014 年 6 月 20 日更新...

伙计们,我似乎发现了问题所在。这是一个小的技术问题,我将代码复杂化以淹没在进一步的错误中。

思路如下:

我不需要担心此时设置的字段,因为许多字段将保持为空。我只需要为每个字段使用这种方法填写一些:

$deviceType                 = $_POST['deviceType'];

此外,使用“int”或“float”需要在如何实现 INSERT INTO ... VALUES 子句方面有所不同。如果让它为空(我现在是),我不能这样做:

$insert_query1 = "INSERT INTO Devices (deviceChanged) VALUES ('$deviceChanged');

此迭代导致表格无法填充适当的值。

相反,用 null 填充它:

$insert_query1 = "INSERT INTO Devices (deviceChanged) VALUES (NULL);

PHP 现在将数据插入 MySQL。感谢您的帮助!

【问题讨论】:

  • 您应该使用带有占位符的准备好的语句,并将您的输入值绑定到这些占位符。这将处理 sql 注入,您也不必逃避您的值。
  • 检查是否有任何错误?
  • 你能举一个这个准备好的陈述的例子吗?
  • 我尝试使用 mysqli_error($link) 但没有任何反应
  • 没关系,但error_reporting(E_ALL); ini_set('display_errors', 1); 会产生更多收益。

标签: php html mysql database mysqli


【解决方案1】:

isset 返回布尔值 (true/false) 不是整数或其他值 (http://www.php.net//manual/en/function.isset.php)

另一个错误是关于如何使用三元比较。在此处查看更多信息:http://davidwalsh.name/php-shorthand-if-else-ternary-operators

所以而不是:

isset($_POST['deviceName']) == 1 ? ($deviceName = ($_POST['deviceName'])) : null;

你应该写

$deviceName = isset($_POST['deviceName']) ? $_POST['deviceName'] : null;

另外请考虑使用某种循环来分配这些变量(如果需要的话)并且不要大量复制您的代码。

【讨论】:

  • 好的,谢谢。我最初设置 isset($_POST['submit']) 但当时不起作用。这是 var_dump 返回的内容: string(436) "INSERT INTO Devices (deviceType, DeviceName, deviceIP, devicePort1, devicePort2, deviceRealLatitude, deviceRealLongitude, deviceVirtualLongitude, @98765 deviceChanged, deviceStatus, deviceLastSeen, deviceBufferSize, deviceSoftwareVersion, deviceMacAddress, deviceTest, deviceAPIKey, deviceSerialID) 值 ('BT', 51204, 45,.45. 1300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)"
  • 查看我上面的编辑 - 我猜我发现了你的问题 :) 你从来没有将 null 分配给 $deviceName。
  • 在您的 INSERT 中查看值 random,那是什么?
  • 这就是我在设备名称字段中输入的内容。我不确定您所说的编辑是什么
  • 抱歉,刚刚进行了编辑。 random 周围应该有 '。此外,字段名称DeviceName 是用表中的第一个小写字母定义的,因此如果您在 mysql 字段名称中混合使用大写/小写字母,请保持一致。
【解决方案2】:

您正在尝试在浮点数的位置插入一个字符串。

您应该从非 varchar 列中删除刻度。示例 devicePort1 被声明为 int 但插入语句正在发送一个带有像 , '".$devicePort1."', 这样的刻度的值,而不是这个,因为 MySQL 期望一个 int 你应该发送 , ".$devicePort1.", ,即没有刻度。

也因为 ID 是 AUTO_INCREMENT 你不应该尝试设置它的值。要检查您的语句是否正确 echo $query ,然后尝试从 MySQL 控制台或 PHPMyAdmin 执行。

一个好的做法是使用准备好的语句或 PDO。检查此PHP: PDO - ManualPrepared Statements Manual。这些链接来自 Php.net,它们包含一个很好的示例说明;

【讨论】:

  • 如果需要,MySQL 会自动将 '123' 转换为整数 123,因此将 '123' 作为值应用于整数列也应该可以。
  • 阿曼纽尔,你把我推得更远了。虽然,当我现在检查数据库时(在表单上输入值之后),除了 dID 之外,字段值都是 0,因为那是 AI。
最近更新 更多