Php 只向DB添加一行,然后跳过其余的

Php 只向DB添加一行,然后跳过其余的,php,mysql,pdo,Php,Mysql,Pdo,我正在尝试将2D数组放入数据库中。我的代码如下(这是PHP): 正确读取配置值,并且添加点的语句正确。 我知道这一点,因为当我运行该函数时,它正确地添加了1个“点”,但没有添加2D数组中的其余行 我的数组如下: array (size=16) 0 => array (size=5) 0 => string '1' (length=1) 1 => string '1' (length=1) 2 => string '1' (length=1) 3 =>

我正在尝试将2D数组放入数据库中。我的代码如下(这是PHP):

正确读取配置值,并且添加点的语句正确。 我知道这一点,因为当我运行该函数时,它正确地添加了1个“点”,但没有添加2D数组中的其余行

我的数组如下:

array (size=16)
0 => 
array (size=5)
  0 => string '1' (length=1)
  1 => string '1' (length=1)
  2 => string '1' (length=1)
  3 => string '0' (length=1)
  4 => string '1' (length=1)
1 => 
array (size=5)
  0 => string '1' (length=1)
  1 => string '2' (length=1)
  2 => string '1' (length=1)
  3 => string '0' (length=1)
  4 => string '1' (length=1)
 (and onwards)
我的问题是,我编写的函数只将第一行(第[0]行)写入数据库,而其他行没有写入

更新 语句的输出(使用打印): 放在准备之后

PDOStatement Object
(
[queryString] => INSERT INTO `Garage2`(`floor`, `spot`, `status`, `uid`, `type`, `time`) VALUES ('1', '1', '1', '0', '1', CURRENT_TIMESTAMP);
)
PDOStatement Object
(
[queryString] => INSERT INTO `Garage2`(`floor`, `spot`, `status`, `uid`, `type`, `time`) VALUES ('1', '2', '1', '0', '1', CURRENT_TIMESTAMP);
)
打印($pdo->errorInfo());输出 放在execute语句的else(fail)部分

Array
(
[0] => 00000
[1] => 
[2] => 
)

试着换掉你的电话线

return 'Spot not added!';
与:

这将让我们看到当查询无法应用时,$行的值是多少。

最终得到了它。 对于那些在将来遇到此问题的人,请确保检查如果您的数据库中有主键,则不会使用相同的值两次。我的第一个单元格是我的主ID,因此当第一个和第二个语句的值都是1时,它失败了

为了找到这个,我在prepare()之后添加了这个\


这应该通过使用准备好的语句来实现, 看看它是否有效,给我留言,然后我会把答案格式化得更好

$spot="INSERT INTO `$dbname`(`floor`, `spot`, `status`, `uid`, `type`, `time`) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)";
$statement = $pdo->prepare($spot);
foreach ($linearray as $lines) {
    $values = array($lines[0],$lines[1],$lines[2],$lines[3],$lines[4])
    if($statement->execute($values)){
        //silent
    }
    else {
        return 'Spot not added!';
    }

对于数字主ID,最好使用自动递增。主ID必须是唯一的。但是,您可以使用不需要唯一的索引或组合索引

要回答有关结果排序的问题,请尝试以下查询:

-- Ordering by floor and spot
SELECT * FROM myTable ORDER BY floor, spot;

-- Ordering by floor only
SELECT * FROM myTable ORDER BY floor;
这里有一个



注:以--(双破折号)开头的行是注释。您可以删除它们

font,small,b,i??90年代打电话来想要回它的html——请学习css和modernhtml@Dagon这就是XDebug…面向21世纪使用PHP的人:P我将删除它的格式为什么在不使用绑定参数的情况下使用
prepare
?这也将消除正在发生的多个不必要的准备(虽然不是自动进行的)。注意
PDO
并不是一种神奇的东西,你可以用它来替换你的
mysql.*
原样的代码。@PeeHaa如果我不这样做,我会在非-object@PeeHaa我不使用mysql。从来没有。它已经被弃用了,所以我从来没有对它进行过修改。
Warning:var_dump()至少需要一个参数
Wierd。它在第二行失败了。但是转储的数组是正确的。@PeeHaa您本打算添加要转储的变量-请参阅修改后的答案。我不打算做任何事情,因为我不是OP:-)。只是想通知您。@chriscct7好吧,让我们继续调试。尝试在错误情况下打印插入查询。如果这仍然不能说明问题,那么请尝试向查询中添加错误报告,如以下问题所示:已解决(主要关键问题:请参阅下文)。谢谢你的帮助。这是一种桌子设计的味道。对于数字主ID,最好使用自动递增。主ID必须是唯一的。但是,您可以使用不需要唯一的索引或组合索引。@Tivie我想要的是,我知道第一列将包含数字1-9,第二列也将包含数字1-9。试图找到一种方法使数据库自动按最低优先级和最低优先级进行排序。PrimaryID无法达到此目的。您不能“对数据库进行排序”,但可以将查询结果排序到数据库。
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$spot="INSERT INTO `$dbname`(`floor`, `spot`, `status`, `uid`, `type`, `time`) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)";
$statement = $pdo->prepare($spot);
foreach ($linearray as $lines) {
    $values = array($lines[0],$lines[1],$lines[2],$lines[3],$lines[4])
    if($statement->execute($values)){
        //silent
    }
    else {
        return 'Spot not added!';
    }
-- Ordering by floor and spot
SELECT * FROM myTable ORDER BY floor, spot;

-- Ordering by floor only
SELECT * FROM myTable ORDER BY floor;