0

変数の数に関係なく、SQLデータベースに挿入できる関数を作成しようとしています。現在、私の機能は機能していません。

function insert($table, $columns, $results){
    global $dbh;
    $results = explode(',',$results); 
    $val= ''; 
    $ex = '';
    foreach($results as $result){ 
        $val .= ":" . $result . ","; 
        $ex = "':" . $result . "' => $result,"; 
    }
    $val = rtrim($val, ','); 
    $ex = rtrim($ex, ',');
    $sql = "INSERT INTO $table ($columns) VALUES ($val)";
    $q = $dbh->prepare($sql);
    $q->execute(array($ex));
}

このように呼ばれます: insert('users','email,pwd,forename,surname,level,status',$vals);

選択機能でそれを機能させることができたのに対し。

function check($table,$columns,$results){
    global $dbh;
    $columns = explode(',',$columns);
    $results = explode(',',$results); 
    $whr= ''; 
    $int = 0;
    foreach($columns as $column){ 
        $whr.= " AND " . $column . " = '{$results[$int]}'"; 
        $int += 1; 
    }
    $sql = "SELECT * FROM $table WHERE status != 'D' $whr";
    $return = 0;
    foreach($dbh->query($sql) as $check){ 
        $return = 1; 
    } 
    return $return;
}
4

2 に答える 2

0

これは私が使用する方法です...

public function iInsert($table,$columns,$values)
    {

        # prepare the insert statement
        $col_str = "(" . implode(",",$columns) . ")";

        # is this a set of values or a select statement?
        if (is_array($values)){
            # this is an array of values
            foreach($values as $value){
                $cnv_val[] = $this->checkNULL($value);
            }
            $q = array_fill(0,count($columns),'?');
            $val_str = "VALUES (" . implode(",", $q)  . ")";

        }else{
            # assume this is a select statement for insert 
            $val_str = $values;
        }

        $syntax_str = "INSERT INTO $table $col_str \r\n$val_str";
        # execute the insert

        $sth = $this->iExec($syntax_str, $cnv_val, "inserted");

        # return the rows affected as a string
        return $sth;

    }

この例では、メソッドを使用してクラスをインスタンス化しますが、アイデアを得るのに役立ちます...

*   INSERT - 
*       *** iInsert( string $table, array $columns, array [or string] $values ); ***
*       Returns: rows affected.
*
*       Example 1:
*
*       $result_array = $test_db->iInsert(  "BIDDING_BASIS_CODES", 
*                           array('BIDDING_BASIS_CODE', 'CODE_DESC',            'CODE_ACTIVE_FLAG', 'IBR_CODE', 'LAST_MOD_BY_USER_ID',  'LAST_MOD_DATE_TIME'),
*                           array('TEST',               'TEST CODE - DISREGARD','N',                'N',        'cd_boust',             '1/1/2011 09:00')       
*                           );
*       echo $result;
*
*       Example 2:
*
*       $result_array = $test_db->iInsert(  "BIDDING_BASIS_CODES", 
*                           array('BIDDING_BASIS_CODE', 'CODE_DESC',            'CODE_ACTIVE_FLAG', 'IBR_CODE', 'LAST_MOD_BY_USER_ID',  'LAST_MOD_DATE_TIME'),
*                           "SELECT 
*                               Row_1,
*                               Row_2,
*                               Row_3,
*                               Row_4,
*                               Row_5,
*                               Row_6
*                           FROM
*                               tablename"      
*                           );
*       echo $result;
于 2012-07-31T18:08:54.320 に答える
0

まず、おそらく列と値を連想配列として関数に渡します。これは、関数の呼び出し元が同じ数の両方を渡さなければならないという事実を強制するのに役立ちます。少なくとも、渡された列と値要素の数を比較して、それらが等しいことを確認するロジックが必要です。このようなことを試してみてください(DB接続をパラメーターとして渡すことにも注意してください。これはコーディングの方が優れています)。

function insert($db, $table, $key_value_array) {
    $sql = 'INSERT INTO ' . $table . ' '; 
    $columns = '(';
    $values = '(';
    foreach ($key_value_array as $k => $v) {
        $columns .= '`' . $k . '`, ';
        $values .= "'" . $v . "', ";
    }
    $columns = rtrim($columns, ', ') . ')';
    $values = rtrim($values, ', ') . ')';
    $sql .= $columns . ' VALUES ' . $values;
    $q = $db->prepare($sql);
    $q->execute();
}
于 2012-07-31T18:11:06.563 に答える