【问题标题】:PHP PDO Insert function with unknown number of variablesPHP PDO插入功能未知数量的变量
【发布时间】:2012-07-31 17:58:45
【问题描述】:

尝试构建一个可以插入到 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);

我设法让它为我的 Select 功能工作。

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

【问题讨论】:

  • 尝试回显$sql,以便我们可以看到您正在准备的查询的确切文本。

标签: php insert pdo explode


【解决方案1】:

首先,我可能会将您的列和值作为关联数组传递给函数。这有助于强制函数调用者必须传递相同数量的两者。至少你应该有逻辑来比较传入的列和值元素的数量,以确保它们相等。您可以尝试这样的事情(注意我还将数据库连接作为参数传递,这是更好的编码实践)。

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

【讨论】:

  • 创建它但缺少值
  • @RobinKnight 请注意,我声明我的函数需要传递列/值对的关联数组。
  • @RobinKnight 我进行了编辑。我没有在循环中使用正确的连接运算符。
  • 像这样的数组: insert('users', array('email' => $email, 'pwd' => $pwd, 'forename' => $forename, 'surname' = > $surname, 'level' => 0, 'status' => 'A')); ??????
  • @RobinKnight 是的,该数组可以工作。我认为您可能遇到的问题是我在原始答案中打错了 $columns 和 $values 分配。查看我的最新评论和编辑。
【解决方案2】:

这是我使用的一种方法...

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2013-09-19
    • 2016-04-07
    • 2011-05-27
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    相关资源
    最近更新 更多