2012-06-20 2 views
1

У меня есть структура SQL таблицы "пользователей, как это (идентификатор генерируется случайным образом по определенным причинам, не автоинкрементным):INSERT в таблицу, если не существует и обратный результат

ID name  deleted lastActive 
3242 Joe  0   20-6-2012 23:14 
2234 Dave  0   20-6-2012 23:13 
2342 Simon 1   20-6-2012 23:02 
9432 Joe  1   20-6-2012 22:58 

В одной query (чтобы избежать одновременных запросов с тем же именем дважды), мне нужно добавить нового пользователя в таблицу, если еще нет записи с этим именем AND deleted = 0. Затем мне нужно знать результат запроса (если пользователь был добавлен), чтобы я мог сообщить, если пользователь был добавлен или нет. Возможно ли это с помощью PHP?

я мог бы сделать это (но, как подготовленное заявление, конечно же!):

INSERT INTO users (ID, name) VALUES ($id, $name) 
    WHERE NOT EXISTS (SELECT 1 FROM users WHERE name = $name AND deleted = 0) 

Но как я могу знать, если пользователь был добавлен или нет?

ответ

2

Если вы используете mysqli, вы можете использовать функцию mysqli_stmt_affected_rows(), чтобы определить, сколько строк было вставлено.

Аналогичным образом вы можете использовать метод PDOStatement::rowCount(), чтобы определить, сколько строк было вставлено для PDO.

Обе функции будут сообщать вам количество строк, вставленных в результате запроса.

+0

Совершенно, никогда не знал, что это существовало. Благодаря! – Timm

+0

Тебе очень нравится Тим! :) – nickb

1

Вот хороший способ вставки, которая возвращает ID:

/** 
* Execute an insert or update in the database. 
* @param $table - Table name. 
* @param $key_name - Primary key to update. NULL to a insert 
* @param $data - Column data array 
* @param $call_on_error function name that should called in case of an exception during the 
* execution of the statment, the function is expected to take one argument, the exception object 
* @return mixed An array containing the key inserted or updated on success, false on failure. 
*/ 
function INSERT($table, $key_name, &$data, $call_on_error = null) { 
    list($min_cols, $prefix, $suffix, $key_value) = isset($data[$key_name]) ? 
     array(2, 'UPDATE', " WHERE `$key_name`=:$key_name", $data[$key_name]) : 
     array(1, 'INSERT', '', null); 
    if (count($data) < $min_cols) { 
     return false; 
    } 
    $set_clause = ''; 
    foreach ($data as $k => $v) { 
     if ($k !== $key_name) { 
      if (($flag_name = strstr($k, "__", true))) { 
       if (strcmp($k, "{$flag_name}__mask") && isset($data["{$flag_name}__value"])) 
        $set_clause .= ",`$flag_name`=:{$flag_name}__value | (`$flag_name` & :{$flag_name}__mask)"; 
      } else { 
       $set_clause .= ",`$k`=:$k"; 
      } 
     } 
    } 
    global $dbo_error_duplicated; 
    $dbo_error_duplicated = false; 
    $dbh = DBH(); 
    try { 
     $sth = $dbh->prepare("$prefix $table SET " . substr($set_clause, 1) . $suffix); 
     $res = $sth->execute($data); 
    } catch (PDOException $e) { 
     $dbo_error_duplicated = $sth->errorCode() === '23000'; 
     echo $e; 
     if(isset($call_on_error)){ 
      call_user_func($call_on_error, $e); 
     } 
     $res = false; 
    } 
    if ($res) { 
     if ($key_value === null && is_numeric($id = $dbh->lastInsertId())) { 
      $key_value = $id; 
     } 
     $res = $key_value === null ? false : array($key_name => $key_value); 
    } 
    return $res; 
} 

и ... ДВГ конфигурации:

/** 
* Get Data Base Handler. 
* Manual @ http://www.php.net/manual/en/pdostatement.fetch.php 
* More info @ http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/ 
* 
* @return PDO Data Base Handler 
*/ 
function DBH() { 
    global $DBH; 
    global $db_config; 

    if ($DBH === null) { 
     // throws PDOException on connection error 
     $DBH = new PDO("mysql:host=$db_config[host];dbname=$db_config[dbname]", $db_config['user'], $db_config['pass'], 
         array(PDO::ATTR_PERSISTENT => $db_config['persistent'], PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES '$db_config[encoding]'")); 
     // ask PDO to throw exceptions for any error 
     $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    return $DBH; 
} 

, который использует этот INI-файл:

[db_config] 
persistent = true 
host  = "localhost" 
user  = "root" 
pass  = "" 
dbname  = "theDbName" 
# host  = "db.production_host.com" 
# user  = "prod_root" 
# pass  = "big4nd5tr0ngp4s5word" 
# dbname = "theDbName" 
encoding = "UTF8" 
Смежные вопросы