从函数内访问MySQL链接标识符

时间:2014-02-26 13:28:44

标签: php function while-loop

我在一个函数中输入一个lopp时遇到一些困难。这是我正在使用的代码。我的意思是能够从函数中返回一个结果数组,该函数包含与特定用户id相关联的图片的id号 - 在这种情况下,我想print_r数组的用户ID为17.当此代码为'n'时在它运作的功能中,但当我把它放在功能中时,没有运气。我认为它与我在返回数组时犯的错误有关。非常感谢您的帮助。

function picture($id)
{
    $sql = "SELECT * FROM avatar WHERE user_id={$id}";
    $result = $database->query($sql);
    $results = array();
    while ($row = mysql_fetch_assoc($result))
    {
       $results[] = $row;
    }
    return $results;
}
$results = picture(17);
print_r($results);

2 个答案:

答案 0 :(得分:1)

您的函数无法访问您的MySQL链接标识符

首先,您将面向对象的范例($database->query($sql))与程序范例(mysql_fetch_assoc($result))混合在一起,这将使您的代码成为维护的噩梦。

假设$databasemysql_链接标识符,您需要将其传递到您的函数中,以便在那里访问它。

function getUserAvatar($database, $id){
    $sql     = 'SELECT * FROM `avatar` WHERE `user_id`=' . intval($id) . ' LIMIT 1;';
    $result  = mysql_query($database, $sql);
    $row     = mysql_fetch_assoc($result);

    return $row;
}

$results = picture($database, 17);

不要只是复制粘贴,继续阅读!

上面的内容可能会有效,但是如果你允许用户将该用户ID传递给该函数,很可能他们能够找到一个漏洞将他们选择的SQL语句注入到MySQL中数据库中。

mysql_函数已弃用,因此理想情况下您应停止使用它们并切换到mysqli或PDO 。您还希望了解预准备语句以防止SQL注入。如果您无法升级,请查看mysql_real_escape_stringintval函数,并确保在处理之前清理所有用户输入。

如果切换到mysqli和prepared statements,结果代码将如下所示:

function getUserAvatar($db, $userId) {
    $stmt = $db->prepare("SELECT * FROM `avatar` WHERE `user_id`=? LIMIT 1;");
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $res = $stmt->get_result();

    return $res->fetch_assoc();
}

$db     = new mysqli("localhost", "user", "password", "database");
$result = getUserAvatar($db, 17);

答案 1 :(得分:-1)

可能你应该试试这个..

function picture($id)
{
    $sql = "SELECT * FROM avatar WHERE user_id={$id}";
    $result = $database->query($sql);
    $row = mysql_fetch_assoc($result);
    return $row;
}

$results = picture(17);
print_r($results);