GVKun编程网logo

使用PHP和MySQL的用户推荐系统

10

本文将介绍使用PHP和MySQL的用户推荐系统的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于nginx、php-fpm和mysql的用户权限如何

本文将介绍使用PHP和MySQL的用户推荐系统的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于nginx、php-fpm和mysql的用户权限如何配置、PHP MySql用户推荐跟踪、php 用户推荐系统曼哈顿算法实现、PHP和MySQL – 检查是否已经使用了用户名的知识。

本文目录一览:

使用PHP和MySQL的用户推荐系统

使用PHP和MySQL的用户推荐系统

我已经有一个完全承诺的会员制度,并希望整合我自己的用户推荐系统,但想要一些提示,建议真正做到这一点.

我当前的注册用户表是类似的

users (table)
– id (user id)
– email (user email)
– password (hash of users password)
– reg_date (date user registered)

我还有其他一些领域,但与我想做的事情无关,为了让事情尽可能简单,我把它们排除在外.

我正在考虑创建一个名为referrals的新表,例如当用户表中我的网站上的注册用户引用某人时(我想我会创建一个表单,询问他们想要引用的人的电子邮件及其名称并将其添加到然后它会在那里显示他们推荐的人以及他们推荐了多少人,以及他们推荐的人是否加入了我的网站.

我希望有人能够在我的推荐表中解释我需要的逻辑来跟踪推荐吗?

到目前为止我的表看起来像这样:

referrals (table)
– uid (id of referrer, this would be a registered user from users table)
– ref_count (total the referrer from users table has referred people)
– action (maybe not rite name) (if the person who was referred completed signup)
– I guess some id or something for the person being referred, not sure and what ever else I may need.

显然,在注册页面上,我会有一个推荐人文本框,用户可以输入他们被推荐的用户名,并检查他们是否被已注册的会员推荐,我想在推荐电子邮件链接中我会添加推荐的用户和在注册页面做一个简单的检查就像注册一样?ref = username_here

如果ref通过get自动将用户名添加到文本框中.

正如你所看到的那样,我正在努力应对推荐表背后的逻辑,如果有人可以解释我还需要什么,我会喜欢它吗?我需要在PHP中完成所有工作(而不是代码),这只是我应该做的快速粗略指导.我知道我需要做一些检查等检查,以确保他们之前没有提到它们(出于垃圾邮件的原因),并且他们想要推荐的人的电子邮件之前没有被其他人推荐(出于垃圾邮件的原因)他们想要推荐的人的电子邮件不存在于用户表等已经注册的成员中.

也许我正在努力比实际更难,但我出于某种原因没有得到它背后的逻辑,如果有人能告诉我,我正在做的事情是完全错误的,而不是最好的方法去做它请做.

我想你可以说我要求一个推荐表的模型(草稿)来做我想要的事情以及我应该在PHP中做的事情将它们整合在一起.

解决方法:

如下设置推荐表:

referrals:
    id (primary key)
    referrer_id (user who is referring someone else)
    referred_email (email of person being referred)
    status (referred[default], registered)
    created_on
    updated_at

遵循政策“不信任任何人”,您不应该使用名称作为推荐中的字段.例如.我发送了推荐信息:email => your_email,name => abuse.它降级了你.

对于计数没有.转介:

select count(*) as referral_count from referrals where referrer_id = 'user_id'

nginx、php-fpm和mysql的用户权限如何配置

nginx、php-fpm和mysql的用户权限如何配置

nginx、php-fpm和mysql的用户权限如何配置

通常情况下,我们运行web应用的服务器有CentOS、Ubuntu、Debian等等的Linux发行版本。这时候,构成服务架构所必须的Nginx、php和MySQL等应用的权限控制就显得非常重要,各个服务对代码目录的权限要求各不相同,缺少某些权限会造成服务无法读写或运行的错误,降低了权限要求又会存在被入侵修改的隐患。

一、web服务器Nginx权限

PHP的运行框架通常都是结合Nginx组成LNMP或者结合Apache组成LAMP的架构,这里用Nginx作为例子讲述一下Nginx服务运行所需要的权限。
我们知道,Nginx本身不能解析PHP的语法,所以Nginx对于静态文件(如HTML等)会直接解析返回结果,但是对于PHP的文件,Nginx会转交给PHP的解释器php-fpm进行处理,处理完后再返回响应给客户端浏览器。

因此,我们代码目录下需要统一Nginx和php的服务所需权限。

①如果统一使用root用户,则一般游客账户无法访问应用,而nginx配置成以root运行的话会存在很大的安全隐患,一旦被攻击就会被获取root身份进行系统的一切操作。

立即学习“PHP免费学习笔记(深入)”;

如果将代码目录的权限统一设置为rwxrwxrwx,则会存在用户能够通过浏览器直接修改代码目录的隐患。

所以最好的办法就是统一归类到一个新的用户组里面,通过给该用户组分配Nginx和php运行必要的权限,来实现对web应用的权限目录管理。在许多情况下,团队会使用www用户组来管理代码目录权限,统一管理用户www。

我们可以看到Nginx的配置文件nginix.conf里面划分的运行权限就是配置到了www用户下,因此Nginx的子进程也是由www用户执行,可以通过ps aux | grep nginx来查看:

nginx、php-fpm和mysql的用户权限如何配置

可以看到nginx的主进程是root,其余子进程均是www的用户

nginx.conf的配置:

nginx、php-fpm和mysql的用户权限如何配置

二、php的权限配置

同样的,php的运行方式也是由主进程root运行,在子进程池(pool)里面配置由www用户执行,具体配置在php根目录下的etc\php-fpm.conf下,添加两行:

user = www
 group = www
登录后复制

即可,同样用ps aux | grep php可以查看进程使用的用户身份:

nginx、php-fpm和mysql的用户权限如何配置

三、MySQL服务的权限配置

通过ps aux | grep mysql可以看到MySQL服务是运行在mysql用户下的,该服务只需要我们在php代码连接mysql时带上mysql的用户名密码即可,不需要统一为www,因为数据层需要与业务逻辑层隔离开,保证底层数据的安全。mysql的授权主要是在mysql服务内新增用户和划分权限,用来控制php不同业务以不同权限范围的身份去连接,确保数据安全。

nginx、php-fpm和mysql的用户权限如何配置

四、总结

nginx配置:

user www www;
登录后复制

php-fpm:

user = www
group = www
登录后复制

目录:

drwxr-xr-x 就是755
登录后复制

以上就是nginx、php-fpm和mysql的用户权限如何配置的详细内容,更多请关注php中文网其它相关文章!

PHP MySql用户推荐跟踪

PHP MySql用户推荐跟踪

我目前正致力于在PHP,MysqL中构建用户推荐跟踪脚本.根据计划,任何完成注册的用户都将获得推荐链接,并且他可以在Facebook和Twitter上分享有关我的应用程序的信息.

现在,除非此用户为我的网站带来至少5个以上的用户,否则他将赢得;不允许查看主页.

现在,我如何跟踪该用户带来的推荐人数?

1.如果我使用$_HTTP_REFERRER – 在这种情况下,我可以获得用户登陆页面的链接.如果这是我的推荐链接,那么我可以更新该用户的数据库条目,以及推荐人数1.但是,$_HTTP_REFERRER的可靠性如何?

2.如果我用来跟踪cookie:在这里我有点困惑,我是否必须为每个浏览器设置cookie或者是否有任何独立于浏览器的cookie设置方法?在设置cookie期间,我应该如何保存它,我的意思是我应该只使用引用ID还是我应该使用引用ID和site_id(或任何其他组合)的组合.

另外,我应该将引荐信息保存在数据库中.该表的理想表模式应该是什么.我有计划的事情:
(USER_ID,USER_NAME,no_of_referrals,referred_by).

解决方法:

要获得引用,您需要使用$_SERVER [‘HTTP_REFERER’].几乎所有的浏览器都会发送一个引用者,但它们并不是强制性的.由于这是客户端的事情,因此可以由用户轻松修改.

我见过的大多数使用此类内容的网站都使用URL中的变量来跟踪原始网站.像这样的东西:

http://www.yoursite.com/someresource?originaccount=12345678

这是否适合您,在很大程度上取决于您打算如何处理这些信息,因为显然有人也可以更改ID.

php 用户推荐系统曼哈顿算法实现

php 用户推荐系统曼哈顿算法实现

<?php
/**
 * Created by PhpStorm.
 * User: linsn 10832126@qq.com 
 * Date: 6/29/2017
 * Time: 10:25 AM
 */
$users = ''{"Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0, "Norah Jones": 4.5, "Phoenix": 5.0, "Slightly Stoopid": 1.5, "The Strokes": 2.5, "Vampire Weekend": 2.0},
         "Bill":{"Blues Traveler": 2.0, "Broken Bells": 3.5, "Deadmau5": 4.0, "Phoenix": 2.0, "Slightly Stoopid": 3.5, "Vampire Weekend": 3.0},
         "Chan": {"Blues Traveler": 5.0, "Broken Bells": 1.0, "Deadmau5": 1.0, "Norah Jones": 3.0, "Phoenix": 5, "Slightly Stoopid": 1.0},
         "Dan": {"Blues Traveler": 3.0, "Broken Bells": 4.0, "Deadmau5": 4.5, "Phoenix": 3.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 2.0},
         "Hailey": {"Broken Bells": 4.0, "Deadmau5": 1.0, "Norah Jones": 4.0, "The Strokes": 4.0, "Vampire Weekend": 1.0},
         "Jordyn":  {"Broken Bells": 4.5, "Deadmau5": 4.0, "Norah Jones": 5.0, "Phoenix": 5.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 4.0},
         "Sam": {"Blues Traveler": 5.0, "Broken Bells": 2.0, "Norah Jones": 3.0, "Phoenix": 5.0, "Slightly Stoopid": 4.0, "The Strokes": 5.0},
         "Veronica": {"Blues Traveler": 3.0, "Norah Jones": 5.0, "Phoenix": 4.0, "Slightly Stoopid": 2.5, "The Strokes": 3.0}
        }'';
$usersArray = json_decode($users, true);

$recommend = new manhattanRecommend;
$recommend = $recommend->recommend(''Hailey'', $usersArray);
echo "<pre>";
print_r($recommend);

class manhattanRecommend
{
    //实现推荐
    public function recommend($username, $users)
    {
        //获得最近用户的name
        $nearest = $this->computeNearestNeighbor($username, $users);
        $nearest = $nearest[''0''][''user''];
        $recommendations = array();
        //得到最近用户的推荐列表
        $neighborRatings = $users[$nearest];
        if ($this->checkArray($neighborRatings)) {
            $usernameAction = $users[$username];
            foreach ($neighborRatings as $name => $code) {
                //读取自己没有的
                if (!isset($usernameAction[$name])) {
                    $recommendations[] = [''name'' => $name, ''score'' => $code];
                }
            }
        }
        $this->sortArrByField($recommendations, ''score'', true);
        return $recommendations;
    }

    //计算曼哈顿距离
    private function manhattan($rate1, $rate2)
    {
        $distance = 0;
        if ($this->checkArray($rate1)) {
            foreach ($rate1 as $name => $value1) {
                if (isset($rate2[$name])) {
                    $value2 = $rate2[$name];
                    $distance += abs($value1 - $value2);
                }
            }
        } else {
            $distance = -1;
        }
        return $distance;
    }

//返回最近距离用户
    private function computeNearestNeighbor($username, $users)
    {
        $distances = array();
        if ($this->checkArray($users)) {
            foreach ($users as $key => $user) {
                if ($key == $username) {
                    continue;
                }
                $distance = $this->manhattan($user, $users[$username]);
                $data = array(
                    ''user'' => $key,
                    ''distance'' => $distance,
                );
                $distances[] = $data;
            }
        }
        $this->sortArrByField($distances, ''distance'', false);
        return $distances;
    }

    /**
     * @param $array
     * @return bool
     * 检查数组有效性
     */
    private function checkArray($array)
    {
        if (is_array($array) && count($array) > 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * @param $array
     * @param $field
     * @param bool $desc
     * 根据数组的某个值进行排序
     */
    private function sortArrByField(&$array, $field, $desc = false)
    {
        $fieldArr = array();
        foreach ($array as $k => $v) {
            $fieldArr[$k] = $v[$field];
        }
        $sort = $desc == false ? SORT_ASC : SORT_DESC;
        array_multisort($fieldArr, $sort, $array);
    }
}

 

PHP和MySQL – 检查是否已经使用了用户名

PHP和MySQL – 检查是否已经使用了用户名

现在的问题是,代码无法检查用户名是否已被占用,是否有任何代码可以检查用户名已经在数据库中?

我正在试验我的一些代码,然后可能在Stack Overflow中搜索了这个问题.我试过这个solution,但显然它给了我错误.当我试过它时,警告:

MysqL_query() expects parameter 2 to be resource, object given in
C:… on line …

和问题

MysqL_num_rows() expects parameter 1 to be resource, null given in
C:… on line …

我实际上正在寻找这个问题的解决方案或教程如何解决这个问题.

我的代码:

<?PHP
    require_once("functions.PHP");
    require_once("db-const.PHP");
    session_start();
    if (logged_in() == true) {
        redirect_to("profile.PHP");
    }
?>
<?PHP
 ?>
<html>
<head>
    <title>Prospekt Member Area</title>
</head>
<body>
<h1> Register Here </h1>
<h2>&copy; Kirk Niverba</h2>
<hr />
<!-- The HTML registration form -->
<form action="<?=$_SERVER['PHP_SELF']?>" method="post">
    Username: <input type="text" name="username" /><br />
    Password: <input type="password" name="password" /><br />
    First name: <input type="text" name="first_name" /><br />
    Last name: <input type="text" name="last_name" /><br />
    Email: <input type="type" name="email" /><br />

    <input type="submit" name="submit" value="Register" />
    <a href="login.PHP">Already have an account?</a>
</form>
<?PHP
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (empty($_POST['username']) || empty($_POST['password']) || empty($_POST['first_name']) || empty($_POST['last_name']) || empty($_POST['email'])) {
        echo "Please fill all the fields!";
    }
elseif (isset($_POST['submit'])) {
## connect MysqL server
    $MysqLi = new MysqLi(localhost, root, "", loginsecure);
    # check connection
    if ($MysqLi->connect_errno) {
        echo "<p>MysqL error no {$MysqLi->connect_errno} : {$MysqLi->connect_error}</p>";
        exit();
    }
## query database
    # prepare data for insertion
    $username   = $_POST['username'];
    $mainpass = $_POST['password'];
    $password   = hash('sha256', $mainpass);
    $first_name = $_POST['first_name'];
    $last_name  = $_POST['last_name'];
    $email      = $_POST['email'];

    # check if username and email exist else insert
    // u = username, e = emai, ue = both username and email already exists
    $user = $_POST['username'];
  $usernamecheck=MysqL_query("SELECT username FROM users WHERE username='$user'", $MysqLi);
        if (MysqL_num_rows($usernamecheck)>=1){
    echo $user." is already taken";
 }
    else{
        # insert data into MysqL database
        $sql = "INSERT  INTO `users` (`id`, `username`, `password`, `first_name`, `last_name`, `email`)
                VALUES (NULL, '{$username}', '{$password}', '{$first_name}', '{$last_name}', '{$email}')";

        if ($MysqLi->query($sql)) {
            header("Location: checklogin.PHP?msg=Registered Successfully!");
        } else {
            echo "<p>MysqL error no {$MysqLi->errno} : {$MysqLi->error}</p>";
            exit();
        }
    }
}
}
?>
<hr />
</body>
</html>

最佳答案:

作为如何使用预准备语句的示例,您可以使用以下(未经测试的顺便说一句)

在原始代码中,您在输出HTML代码后发送标题 – 这将导致错误,除非您使用输出缓冲,因此我在生成任何html内容之前移动了所有相关的PHP代码,如果有任何错误输出它们.

我还注意到MysqLi连接的参数没有被引用 – 如果这些参数被定义为常量,那么这样就可以了,否则也会产生错误.

继续使用MysqLi或pdo – 因为当您采用我试图在此处展示的预准备语句时,您可以更好地保护您的站点免受恶意用户的攻击.

<?PHP
    require_once("functions.PHP");
    require_once("db-const.PHP");
    session_start();

    if (logged_in() == true) {
        redirect_to("profile.PHP");
    }

    $errors=array();

    if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

        if( isset( $_POST['username'], $_POST['password'], $_POST['first_name'], $_POST['last_name'], $_POST['email'] ) ) {

            $username   = !empty( $_POST['username'] ) ? $_POST['username'] : false;
            $mainpass   = !empty( $_POST['password'] ) ? $_POST['password'] : false;
            $password   = !empty( $mainpass ) ? hash('sha256', $mainpass) : false;
            $first_name = !empty( $_POST['first_name'] ) ? $_POST['first_name'] : false;
            $last_name  = !empty( $_POST['last_name'] ) ? $_POST['last_name'] : false;
            $email      = !empty( $_POST['email'] ) ? $_POST['email'] : false;

            if( $username && $password ){
                $MysqLi = new MysqLi( DB_HOST, DB_USER, DB_PASS, DB_NAME );
                if( $MysqLi->connect_errno ) {
                    $errors[]=$MysqLi->connect_error;
                } else {

                    /* Assume all is ok so far */
                    $sql='select username from users where username=?';
                    $stmt=$MysqLi->prepare($sql);
                    $stmt->bind_param('s',$username);
                    $stmt->execute();

                    $stmt->bind_result( $found );
                    $stmt->fetch();

                    if( !$found ){
                        /* username is not alreday taken */

                        $sql='insert into `users` (`username`,`password`,`first_name`,`last_name`,`email`) values (?,?,?,?,?);';
                        $stmt=$MysqLi->prepare( $sql );
                        $stmt->bind_param('sssss',$username,$password,$first_name,$last_name,$email);
                        $stmt->execute();

                        header("Location: checklogin.PHP?msg=Registered Successfully!");
                    } else {
                        /* username is taken */
                        $errors[]='Sorry, that username is already in use.';
                    }
                }   
            }
        } else {
            $errors[]='Please fill in all details';
        }
    }
?>
<html>
    <head>
        <title>Prospekt Member Area</title>
    </head>
    <body>
        <h1> Register Here </h1>
        <h2>&copy; Kirk Niverba</h2>
        <hr />

        <!-- The HTML registration form -->
        <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
            Username: <input type="text" name="username" /><br />
            Password: <input type="password" name="password" /><br />
            First name: <input type="text" name="first_name" /><br />
            Last name: <input type="text" name="last_name" /><br />
            Email: <input type="type" name="email" /><br />

            <input type="submit" name="submit" value="Register" />
            <a href="login.PHP">Already have an account?</a>
        </form>
        <?PHP
            if( !empty( $errors ) ){
                echo implode( '<br />', $errors );
            }
        ?>
        <hr />
    </body>
</html>

关于使用PHP和MySQL的用户推荐系统的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于nginx、php-fpm和mysql的用户权限如何配置、PHP MySql用户推荐跟踪、php 用户推荐系统曼哈顿算法实现、PHP和MySQL – 检查是否已经使用了用户名的相关信息,请在本站寻找。

本文标签: