1

这里有什么问题?我得到了用户表很好。我已确保列名 uid 存在。但是当我尝试从查询中获取 uid 时,什么也没有回来。这很好,因为桌子是空的。但是,我的 INSERT INTO 命令不起作用,因为在 INSERT INTO 之后,我仍然没有返回 uid。使用 Postgres 9.1.5。谢谢!

$query = "SELECT * FROM information_schema.tables WHERE table_name = 'usertable';";
$result = pg_query($dbconn, $query);

if (pg_num_rows($result)) 
{
    echo "Table exists<br>";
    checkForUserRow();
}
else
{
   echo "Error on query, attempting to create table<br>";
   $sql = "CREATE TABLE usertable (uid integer PRIMARY KEY, sign varchar(255));";
   pg_query($dbconn, $sql) or die(pg_errormessage());

   $result = pg_query($dbconn,$query);
   if (pg_num_rows($result)) {
       echo "Table created<br>";
       checkForUserRow();
   }
}

pg_close($conn);

function checkForUserRow()
{
    $query = "SELECT uid FROM usertable WHERE uid = '123'";
    $result = pg_query($dbconn, $query);

if(pg_num_rows($result)) 
{
    echo "User DB row exists<br>";
}
else
{
    echo "User row does not exist - attempt to add user to table<br/>";

    $sql = "INSERT INTO usertable (uid) VALUES('123')";
    pg_query($dbconn, $sql);

    $result = pg_query($dbconn, $query);
    if (pg_num_rows($result)) 
    {
        echo "User successfully added!<br/>";
        }
    else
    {
        echo "User not added :(";
    }
}
4

2 回答 2

1

在您的函数内部,您需要获取全局$dbconn

function checkForUserRow()
{
    global $dbconn;
    // everything else
}

这是因为当您pg_query($dbconn, $query);在函数内部执行操作时,它使用的是不存在的本地版本的 $dbconn。

如果您愿意,也可以选择传入 $dbconn 作为参数:

function checkForUserRow($dbconn)
{
    // global $dbconn; // Don't need this anymore.
    // everything else
}
于 2012-12-05T00:14:16.117 回答
0

如果你从一个空表开始,那么:

if (pg_num_rows($result)) 

将始终评估为假。这意味着您将始终尝试创建一个新表(由于表存在触发die(pg_errormessage());.

这意味着checkForUserRow()永远不会被调用。

即使它被调用,$dbconn也不存在于您的checkForUserRow()函数范围内,这意味着您的任何查询都不会在此函数中起作用。

您对错误消息的初步调试和审查将向您展示您的执行路径如何无法正常工作。

还有这行代码:

pg_close($conn);

指的是数据库连接的不同变量名,然后在其他地方使用。

于 2012-12-05T00:13:29.987 回答