0

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

public function addspot($linearray,$data){
    $dbname=$data['dbname'];
    try {
        /* Create a connections with the supplied values */
        $pdo = new PDO("mysql:host=" . Config::read('hostname') . ";dbname=" . Config::read('database'). "", Config::read('username'), Config::read('password'), array(PDO::ATTR_PERSISTENT => true));
    } catch(PDOException $e) {
        /* If any errors echo the out and kill the script */
        return 'Database conncetion fail in assets/garage.class.php!Make sure your database information is correct';
    }

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

配置值被正确读取,并且添加点的语句是正确的。我知道这一点是因为当我运行该函数时,它会正确添加 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)

我的问题是我编写的函数只将第一行(line[0])写入数据库,而其他的没有写入。

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

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);
)

print_r($pdo->errorInfo()); 输出放在执行语句的else(fail)部分

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

3 回答 3

0

终于明白了。对于将来遇到此问题的人,请务必检查您的数据库中是否有主键,您没有两次使用相同的值。我的第一个单元格是我的主 ID,因此当第一个和第二个语句的值都为 1 时,它失败了。

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

$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
于 2012-12-04T20:56:13.600 回答
0

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

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

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

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

这是一个

SQLFiddle


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

于 2012-12-05T03:20:57.190 回答
0

这应该使用准备好的语句来解决问题,看看它是否有效并给我留言然后我会更好地格式化答案

$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!';
    }
于 2012-12-04T20:58:18.233 回答