【问题标题】:Simple PHP SQLite question简单的 PHP SQLite 问题
【发布时间】:2011-07-01 15:27:15
【问题描述】:

我正在尝试实现一个函数,如果一个具有相同名称(与给定名称相同)的字段尚不存在,该函数将在数据库中插入一个新条目。特别是我想限制表中重复的用户名。

我能想到的唯一方法是运行一个选择查询,然后如果它没有返回任何内容,则运行插入查询。出于某种原因,虽然我无法让它工作......


我的数据库选择函数

function getAllUsers($user)
{
    $stmt = $this->db->stmt_init();
    $stmt->prepare('SELECT username from users where username=? ');
    $stmt->bind_param("s", $user);
    $stmt->bind_result($username);
    $stmt->execute();
    $results = array();
    while($stmt->fetch())
    {
        $results[] = array('username' => $username);
    }        
    $stmt->close();        
    return $results;
}

我的 php 代码(这是在不同的页面中)

foreach ($GLOBALS['db']->getAllUsers($_POST['username']) as $i)
{
    $results =  "".$i['username']."";       
    break;
}    
if(strcmp($results, "")==0)
{
    if($GLOBALS['db']->addUser($_POST['username'],$_POST['password']))
    {
            session_destroy();                
            echo "registerSucces";
    }
    else
    {
            session_destroy();
            echo "registerError";
    }
}
else
{
        echo "userNameExists";
}

你能看出这有什么问题吗???

谢谢

迈克


仍然无法找到如何使上述代码工作,但以防万一有人需要:一个临时的简单解决方案是根本不比较字符串,而是在 foreach 循环中有一个计数器,然后检查所需的数字( 0 在我的情况下)...

【问题讨论】:

    标签: php sqlite select insert


    【解决方案1】:

    SQLite 支持唯一的constraint。只需在列上声明一个 UNIQUE 索引并检查 INSERT 是否失败。

    【讨论】:

    • 同样的问题...php如何知道插入查询失败?
    • @mixkat:你使用的是什么数据库扩展?在大多数情况下,无论您使用什么方法来执行查询(例如PDOStatement::executeSQLite3Stmt::execute)都会在失败时返回 FALSE,而在成功时返回一些 true 值。额外的错误信息(如何获得取决于扩展名)将给出确切原因,例如重复键错误。
    【解决方案2】:

    如果您使用用户名作为表中的主键,则可以使用 INSERT OR IGNORE 命令而不是检查用户名是否已存在。

    如果 SQLite 发现 INSERT OR IGNORE 命令会与表中的现有行冲突,它将简单地忽略该命令。

    您可以在SQLite documentationINSERT command 中找到更多内容

    【讨论】:

    • 是的,但是 php 怎么知道插入失败?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多