0

2D配列をデータベースに入れようとしています。私のコードは次のとおりです(これは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()); 出力executeステートメントのelse(失敗)部分に配置されます

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

3 に答える 3

0

ついにそれを手に入れました。将来この問題が発生する場合は、DBに主キーがある場合は、同じ値を2回使用していないことを確認してください。最初のセルはプライマリIDであったため、最初と2番目のステートメントの両方の値が1の場合、失敗しました。

これを見つけるために、prepare()\の直後にこれを追加しました

$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
于 2012-12-04T20:56:13.600 に答える
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 に答える
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 に答える