Просмотр полной версии : Выбор случайной записи и запись ее в другую таблицу
Есть база mysql с таблицей usertbl.
Нужно выбрать из нее случайную 1 запись из поля username. Далее полученное значение записать таблицу uch в поле username значение с выше и в поле date текущую дату. Как реализовать это на php? В гугле нет похожего решения.
shumbola
04.03.2016, 08:36
Есть база mysql с таблицей usertbl.
Нужно выбрать из нее случайную 1 запись из поля username. Далее полученное значение записать таблицу uch в поле username значение с выше и в поле date текущую дату. Как реализовать это на php? В гугле нет похожего решения.
В гугле миллион + тележка решений. :-)
Надеюсь, не просите написать рабочий код, а только подсказку. :-)
Так как, почти ничего не известно о структуре бд, предложу универсальный вариант:
0. будем считать, что кол-во записей не меняется во время операций с бд
1. находим кол-во записей, select count(*) from usertbl
2. используя встроенную функцию php rand($min, $max) (либо mt_rand($min, $max) или других), выберем случайное число $r в диапазоне [1-кол-во записей]
3. делаем выборку из таблицы, select username from usertbl limit $r, 1
4. записываем в таблицу uch, insert into uch(username, date) values($username, current_date)
-лучше использовать в качестве названия колонки что-то другое чем date
-лучше сделать это в stored procedure в mysql
-и т.д.
<?
$schetchikrow = (mysql_query('SELECT COUNT(*) FROM usertbl;');
$zapros1 = array();
while (count($zapros1) < 1) {
$zapros1[] = '(SELECT * FROM usertbl LIMIT '.rand(0, $schetchikrow).', 1)';
}
$res = mysql_query($zapros1);
mysql_query("insert into uch(username, dennj) values($username, current_date)");
print mysql_query(SELECT *, FROM uch)
?>
Накинул такой код, но ничего не происходит.
Aziz Madetov
04.03.2016, 13:09
$schetchikrow = (mysql_query('SELECT COUNT(*) FROM usertbl;');
У вас скобка не закрыта.
Такую выборку можно выполнить с помощью одного SQL-запроса, а в PHP передать результат.
kelt, УЖОС!
Один запрос.
INSERT INTO uch (username, date) VALUES ((SELECT username FROM usertbl ORDER BY RAND() LIMIT 1), TIME)
shumbola
04.03.2016, 13:47
kelt, УЖОС!
Один запрос.
INSERT INTO uch (username, date) VALUES ((SELECT username FROM usertbl ORDER BY RAND() LIMIT 1), TIME)
kelt учиться, поэтому step-by-step. ;)
shumbola
04.03.2016, 14:43
kelt, остерегайтесь использовать одно-строчные запросы не разбиравшись, иначе пойдут вопросы типа а почему это медленно и т.д.
Фёдор, шикарный запрос в SQL
INSERT INTO uch (username, dennj) VALUES ((SELECT username FROM usertbl ORDER BY RAND() LIMIT 1), current_date)
Только как этот запрос выполнить средствами php?
Попробовал это
<?php mysql_query("INSERT INTO uch (username, dennj) VALUES ((SELECT username FROM usertbl ORDER BY RAND() LIMIT 1), current_date)");
?>
Ничего не происходит. Соединение с базой есть, но ничего не происходит.
shumbola, в базе около 120тыс записей. Сама база дала результат через 2 секунды. Случайная выборка будет происходить каждый день в 00,05 по времени сервера, т.е. 1 раз в сутки. Осталось только решить вопрос как это реализовать на php.
Код сейчас выглядит так, почему не добавляется случайная запись из таблицы usertbl в таблицу uch?
Сам код
<?php
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "userlistdb");
$con = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error());
mysql_select_db(DB_NAME) or die("Cannot select DB");
mysql_query("INSERT INTO uch (username, dennj) VALUES ((SELECT username FROM usertbl ORDER BY RAND() LIMIT 1), current_date)",$con);
$qr_result = mysql_query("select * from " . uch)
or die(mysql_error());
echo '<table border="1">';
echo '<thead>';
echo '<tr>';
echo '<th>id</th>';
echo '<th>number</th>';
echo '<th>datenj</th>';
echo '</tr>';
echo '</thead>';
echo '<tbody>';
while($data = mysql_fetch_array($qr_result)){
echo '<tr>';
echo '<td>' . $data['id'] . '</td>';
echo '<td>' . $data['username'] . '</td>';
echo '<td>' . $data['dennj'] . '</td>';
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
?>
kelt, научитесь выслеживать ошибки.
Я бы с радостью Вам помочь, но у меня нет времени создавать эмуляцию Вашего случая.
И потом, используйте модуль НЕ mysql а именно mysqli он более производительнее, а лучше вообще PDO, на будущее больше пригодится.
Фёдор,спасибо вам за помощь. Предыдущий код работает.
shumbola, вам также спасибо за помощь.
Еще нужно прикрутить функцию в персональном кабинете пользователя.
Например он авторизован, теперь нужна кнопка на странице чтобы она добавляла дату т.е. сегодняшнею в базу при нажатии на нее. Структура таблицы uch поля id username dennj plnjnakn. Кнопка должна найти пользователя по username в этой таблице и добавить в поле plnjnakn текущую дату.
страница ПК
<?php
session_start();
if(!isset($_SESSION["session_username"])) {
header("location:login.php");
} else {
?>
<div id="welcome">
<h2>Welcome, <span><?php echo $_SESSION['session_username'];?>! </span></h2>
<p><a href="logout.php">Logout</a> Here!</p>
</div>
<?php
}
?>
Страница авторизации <?php
session_start();
?>
<?php require_once("includes/connection.php"); ?>
<?php
if(isset($_SESSION["session_username"])){
// echo "Session is set"; // for testing purposes
header("Location: intropage.php");
}
if(isset($_POST["login"])){
if(!empty($_POST['username']) && !empty($_POST['password'])) {
$username=$_POST['username'];
$password=$_POST['password'];
$query =mysql_query("SELECT * FROM usertbl WHERE username='".$username."' AND password='".$password."'");
$numrows=mysql_num_rows($query);
if($numrows!=0)
{
while($row=mysql_fetch_assoc($query))
{
$dbusername=$row['username'];
$dbpassword=$row['password'];
}
if($username == $dbusername && $password == $dbpassword)
{
$_SESSION['session_username']=$username;
header("Location: intropage.php");
}
} else {
$message = "Неверный или пароль!";
}
} else {
$message = "Введите и пароль";
}
}
?>
<div class="container mlogin">
<div id="login">
<h1>Авторизация</h1>
<form name="loginform" id="loginform" action="" method="POST">
<p>
<label for="user_login">Номер телефона<br />
<input type="text" name="username" id="username" class="input" value="" size="20" /></label>
</p>
<p>
<label for="user_pass">Пароль<br />
<input type="password" name="password" id="password" class="input" value="" size="20" /></label>
</p>
<p class="submit">
<input type="submit" name="login" class="button" value="Log In" />
</p>
</form>
</div>
</div>
<?php if (!empty($message)) {echo "<p class=\"error\">" . "MESSAGE: ". $message . "</p>";} ?>
Rooslan Khayrov
04.03.2016, 22:41
таблицы uch поля id username dennj plnjnakn
Меня всё мучает вопрос, какой человеческий язык в основе этих названий? На проход кошки по клавиатуре не похоже, но и осмысленной интерпретации никакой придумать не могу.
$query =mysql_query("SELECT * FROM usertbl WHERE username='".$username."' AND password='".$password."'");
Пожалуйста, не надо так писать. Даже если только учитесь.
SQL-инъекция (https://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D 0%B5_SQL-%D0%BA%D0%BE%D0%B4%D0%B0)
Соль пароля (https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BB%D1%8C_(%D0%BA%D1%80%D0%B8%D0%BF %D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F)
Rooslan Khayrov,все верно пароль пишется в базу в открытом виде, нет md5. Я его потом добавлю. Скорее всего придется переписать в PDO. В данный момент нужно сделать базовый функционал, а уже потом скорее всего придется нанять толкового программиста php для того чтобы привести код в божеский вид. Сейчас нет денег на него. Приходится осваивать php самому. Я лично с php знаком пока только 3 дня. Также заметил что все только могут учить, а вот помогать никто не хочет, лишь только единицы, да и то только советами.
Как создать запрос чтобы php взял из ($_SESSION["session_username"]) значение username, нашел ее в таблице uch и добавил в поле plnjnakn текущую дату сервера. И чтобы этот запрос выполнялся при нажатии кнопки.
Азизбек Кадыров
04.03.2016, 23:29
Как создать запрос чтобы php взял из ($_SESSION["session_username"]) значение username, нашел ее в таблице uch и добавил в поле plnjnakn текущую дату сервера. И чтобы этот запрос выполнялся при нажатии кнопки.
$session_username=mysql_real_escape_string($_SESSI ON['username']);
$query = mysql_query("UPDATE uch SET plnjnakn=NOW() WHERE username=".$session_username." LIMIT 1");
вот такой страшный код )) Про инъекции вам уже написали выше
Азизбек Кадыров, не работает этот код. $session_username=mysql_real_escape_string($_SESSI ON['username']);
$query = mysql_query("UPDATE uch SET plnjnakn=NOW() WHERE username=".$session_username." LIMIT 1"); В чем причина не понятно. Скрипт отрабатывает, но ошибок не выводит.
Тут вывод данных с таблицы
<?php
$qr_result = mysql_query("select * from " . uch)
or die(mysql_error());
echo '<table border="1">';
echo '<thead>';
echo '<tr>';
echo '<th>id</th>';
echo '<th>нд</th>';
echo '<th>Дата в</th>';
echo '<th>Дата п</th>';
echo '</tr>';
echo '</thead>';
echo '<tbody>';
while($data = mysql_fetch_array($qr_result)){
echo '<tr>';
echo '<td>' . $data['id'] . '</td>';
echo '<td>' . $data['username'] . '</td>';
echo '<td>' . $data['dennj'] . '</td>';
echo '<td>' . $data['plnjnakn'] . '</td>';
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
?>
Мне выводится полностью . $data['username'] . Как сделать чтобы выводились только 5 последних символов? А остальные закрывались звездочками.
Азизбек Кадыров
05.03.2016, 15:21
kelt,а вы вообще в сессию что нибудь сохраняете? может там ничего нет, поэтому не работает код.
echo str_repeat("*",strlen($data['username']-5)).substr($data['username'],strlen($data['username'])-5);
Азизбек Кадыров, Сессия создается. При успешной авторизации создается такое куки у пользователя http://prntscr.com/abiikp
Сервер выдает такие ошибки
Warning: mysql_real_escape_string(): MySQL server has gone away in on line 20
Warning: mysql_real_escape_string(): A link to the server could not be established in on line 20
Warning: mysql_query(): MySQL server has gone away in on line 21
Warning: mysql_query(): A link to the server could not be established in on line 21
echo str_repeat("*",strlen($data['username']-5)).substr($data['username'],strlen($data['username'])-5);
Отлично. заработало с первого раза.
Азизбек Кадыров
05.03.2016, 21:58
kelt, сорри за оффтоп, как вы умудрились за 322 сообщения набрать 477 минусов? ))
kelt, сорри за оффтоп, как вы умудрились за 322 сообщения набрать 477 минусов? ))
Последствия троллинга.
Вот код авторизации.
<?php
session_start();
?>
<?php require_once("includes/connection.php"); ?>
<?php
if(isset($_SESSION["session_username"])){
// echo "Session is set"; // for testing purposes
header("Location: intropage.php");
}
if(isset($_POST["login"])){
if(!empty($_POST['username']) && !empty($_POST['password'])) {
$username=$_POST['username'];
$password=$_POST['password'];
$query =mysql_query("SELECT * FROM usertbl WHERE username='".$username."' AND password='".$password."'");
$numrows=mysql_num_rows($query);
if($numrows!=0)
{
while($row=mysql_fetch_assoc($query))
{
$dbusername=$row['username'];
$dbpassword=$row['password'];
}
if($username == $dbusername && $password == $dbpassword)
{
$_SESSION['session_username']=$username;
header("Location: intropage.php");
}
} else {
$message = "Неверный или пароль!";
}
} else {
$message = "Введите и пароль";
}
}
?>
<div class="container mlogin">
<div id="login">
<h1>Авторизация</h1>
<form name="loginform" id="loginform" action="" method="POST">
<p>
<label for="user_login">Номер телефона<br />
<input type="text" name="username" id="username" class="input" value="" size="20" /></label>
</p>
<p>
<label for="user_pass">Пароль<br />
<input type="password" name="password" id="password" class="input" value="" size="20" /></label>
</p>
<p class="submit">
<input type="submit" name="login" class="button" value="Log In" />
</p>
</form>
</div>
</div>
<?php if (!empty($message)) {echo "<p class=\"error\">" . "MESSAGE: ". $message . "</p>";} ?>
Видимо он не пишет в куки имя пользователя.
<?php
session_start();
if(!isset($_SESSION["session_username"])) {
header("location:login.php");
} else {
?>
<div id="welcome">
<h2>Welcome, <span><?php echo $_SESSION['session_username'];?>! </span></h2>
<p><a href="logout.php">Logout</a> Here!</p>
</div>
<?php
}
?>
Эта строка выводит в ПК имя пользователя <?php echo $_SESSION['session_username'];?> без проблем.
Но этот код не хочет добовлять значение ".$session_username." в поле plnjnakn
$session_username=mysql_real_escape_string($_SESSI ON['username']);
$query = mysql_query("UPDATE uch SET plnjnakn=NOW() WHERE username=".$session_username." LIMIT 1");
У вас нет готового решения с нормальной регистрацией и с авторизацией? Написанной на pdo или с простой защитой от sql иньекции. В сети интернет есть готовые решения но опять таки без защиты и норамльнно не работают.
Ладно понятно, как сделать тогда форму чтобы пользователь ввел сам свой $username и из этой формы php искал в базе и в случае совпадения добавил текущую дату в поле plnjnakn
Азизбек Кадыров
06.03.2016, 13:27
Ладно понятно, как сделать тогда форму чтобы пользователь ввел сам свой $username и из этой формы php искал в базе и в случае совпадения добавил текущую дату в поле plnjnakn
Дальше уже сами ) Читайте доки, stackoverflow, php.net, это будет полезней чем если мы приведем вам готовый код. Ищите "передача данных из формы в php", "поиск и обновление данных в mysql", и соответствующие темы
TheAnother
06.03.2016, 14:02
Дальше уже сами ) Читайте доки, stackoverflow, php.net, это будет полезней чем если мы приведем вам готовый код. Ищите "передача данных из формы в php", "поиск и обновление данных в mysql", и соответствующие темы
Я всё ждал, когда же вы перестанете давать ему рыбу, а дадите удочку...
Дальше уже сами ) Читайте доки, stackoverflow, php.net, это будет полезней чем если мы приведем вам готовый код. Ищите "передача данных из формы в php", "поиск и обновление данных в mysql", и соответствующие темы
Вы уже сами за меня решаете что для меня будет лучше?
Азизбек Кадыров
06.03.2016, 20:35
Вы уже сами за меня решаете что для меня будет лучше?
Я не говорил что лучше, я написал что полезней )
Забесплатно, мало кто захочет ломать голову над вашими задачами
session_start();
function Fix($str) {
$str = trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
$errmsg = array();
$errflag = false;
$username = Fix($_POST['username']);
$password = Fix($_POST['password']);
if($username == '') {
$errmsg[] = 'Ошибка, проверьте логин';
$errflag = true;
}
if($password == '') {
$errmsg[] = 'Ошибка, проверьте пароль';
$errflag = true;
}
if($errflag) {
$_SESSION['ERRMSG'] = $errmsg;
session_write_close();
header("location: login.php");
exit();
}
С этим кодом вроде теперь не смогут сделать sql инъекцию.Я прав или нужно еще что-то дописать?
Constantin
09.03.2016, 14:01
Мои глаза
vBulletin® v3.8.5, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot