关于正确查询的问题

时间:2011-08-09 05:15:22

标签: php mysql

我有一个包含4列(id,name,email,password)的表author

CREATE TABLE author (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    email VARCHAR(255),
    password CHAR(32),
    UNIQUE (email)
) DEFAULT CHARACTER SET utf8;

在我的php中,我正在尝试运行查询以从id获取author,然后在article下的另一个查询中将其插入表authorid

SQL:

CREATE TABLE article (
   id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   articletext TEXT,
   articledate DATE NOT NULL,
   authorid INT NOT NULL

) DEFAULT CHARACTER SET utf8;

index.php:

<?php
include_once $_SERVER['DOCUMENT_ROOT'] .
        '/includes/magicquotes.inc.php';
include $_SERVER['DOCUMENT_ROOT'] . 
        '/includes/access.inc.php';

if (isset($_GET['add']))
  if (!userIsLoggedIn())
{
      include $_SERVER['DOCUMENT_ROOT'] . '/includes/login.inc.html.php';
      exit();
}
  else
{
    $pagetitle = 'New Article';
    $action = 'addform';
    $text = '';
    $authorid = '';
    $id = '';
    $button = 'Add article';

    include 'form.html.php';
    exit();
}
if (isset($_GET['addform']))
{
    include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php';


    $text = mysqli_real_escape_string($link, $_POST['text']);
    $authorid = mysqli_real_escape_string($link, $_SESSION['id']);

    $sql = "INSERT INTO article SET
            articletext='$text',
            articledate=CURDATE(),
            authorid= '$authorid'";
    if (!mysqli_query($link, $sql))
    {
        $error = 'Error adding submitted article: ' . mysqli_error($link);
        include 'error.html.php';
        exit();
    }

    header('Location: .');
    exit();
}
include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php';

$result = mysqli_query($link, 'SELECT id, articletext FROM article');
if (!$result)
{
    $error = 'Error fetching articles: ' . mysqli_error($link);
    include 'error.html.php';
    exit();
}

while ($row = mysqli_fetch_array($result))
{
    $articles[] = array('id' => $row['id'], 'text' => $row['articletext']);
}

include 'articles.html.php';
?>

access.inc.php:

<?php
function userIsLoggedIn()
{
    if (isset($_POST['action']) and $_POST['action'] == 'login')
    {
        if (!isset($_POST['email']) or $_POST['email'] == '' or
            !isset($_POST['password']) or $_POST['password'] == '')
        {
            $GLOBALS['loginError'] = 'Please fill in both fields';
            return FALSE;
        }
        $password = md5($_POST['password'] . 'chainfire db');
        if (databaseContainsAuthor($_POST['email'], $password))
        {   
        include 'db.inc.php';
            session_start();
            $_SESSION['loggedIn'] = TRUE;
            $_SESSION['email'] = $_POST['email']; 

            $sql = "SELECT id FROM author 
                    WHERE email = '{$_SESSION['email']}'";

            $result = mysqli_query($link, $sql);
            $row = mysqli_fetch_assoc($result);

            $_SESSION['id'] = $row['id'];
            $_SESSION['password'] = $password;
            return TRUE;
        }
        else
        {
            session_start();
            unset($_SESSION['loggedIn']);
            unset($_SESSION['email']);
            unset($_SESSION['id']);
            unset($_SESSION['password']);
            $GLOBALS['loginError'] = 'The specified email address or password was incorrect.';
            return FALSE;
        }
    }
    if (isset($_POST['action']) and $_POST['action'] == 'logout')
    {
        session_start();
        unset($_SESSION['loggedIn']);
        unset($_SESSION['email']);
        unset($_SESSION['id']);
        unset($_SESSION['password']);
        header('Location: ' . $_POST['goto']);
        exit();
    }
    session_start();
    if (isset($_SESSION['loggedIn']))
    {
        return databaseContainsAuthor($_SESSION['email'], $_SESSION['password']);
    }
}
function databaseContainsAuthor($email, $password)
{
    include 'db.inc.php';

    $email = mysqli_real_escape_string($link, $email);
    $password = mysqli_real_escape_string($link, $password);

    $sql = "SELECT COUNT(*) FROM author
            WHERE email='$email' AND password='$password'";
    $result = mysqli_query($link, $sql);

    if (!$result)
    {
        $error = 'Error searching for author.';
        include 'error.html.php';
        exit();
    }
    $row = mysqli_fetch_array($result);
    if ($row[0] > 0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}
function userHasRole($role)
{
    include 'db.inc.php';

    $email = mysqli_real_escape_string($link, $_SESSION['email']);
    $role = mysqli_real_escape_string($link, $role);

    $sql = "SELECT COUNT(*) FROM author
            INNER JOIN authorrole ON author.id = authorid
            INNER JOIN role ON roleid = role.id
            WHERE email = '$email' AND role.id='$role'";

    $result = mysqli_query($link, $sql);
    if (!$result)
    {
        $error = 'Error searching for author roles.';
        include 'error.html.php';
        exit();
    }
    $row = mysqli_fetch_array($result);

    if ($row[0] > 0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

?>

我留下了一些代码,我无法获取authorid表中的article列来返回除0之外的任何内容。我想知道这是否与id有关author表格中的{1}}列有一个PRIMARY KEY属性以及我设置为email的{​​{1}}列。我应该运行不同的查询,以便更好地引用具有UNIQUEPRIMARY KEY属性的列吗?

1 个答案:

答案 0 :(得分:2)

mysqli_query返回结果资源(指向内存中结果集缓冲区的指针)。

这就是您分配给$id的内容。

您必须从该结果中获取行,并使用每行的所需列。

$sql = "SELECT id FROM author 
        WHERE email = '{$_SESSION['email']}'";

$result = mysqli_query($link, $sql);
$row = mysqli_fetch_assoc($result);
$_SESSION['id'] = $row['id'];