PDA

Просмотр полной версии : Выбор случайной записи и запись ее в другую таблицу


kelt
04.03.2016, 00:07
Есть база 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
-и т.д.

kelt
04.03.2016, 11:25
<?

$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 передать результат.

Фёдор
04.03.2016, 13:15
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, остерегайтесь использовать одно-строчные запросы не разбиравшись, иначе пойдут вопросы типа а почему это медленно и т.д.

kelt
04.03.2016, 15:03
Фёдор, шикарный запрос в 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)");
?>

Ничего не происходит. Соединение с базой есть, но ничего не происходит.

kelt
04.03.2016, 15:05
shumbola, в базе около 120тыс записей. Сама база дала результат через 2 секунды. Случайная выборка будет происходить каждый день в 00,05 по времени сервера, т.е. 1 раз в сутки. Осталось только решить вопрос как это реализовать на php.

kelt
04.03.2016, 15:48
Код сейчас выглядит так, почему не добавляется случайная запись из таблицы 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>';


?>

Фёдор
04.03.2016, 16:16
kelt, научитесь выслеживать ошибки.
Я бы с радостью Вам помочь, но у меня нет времени создавать эмуляцию Вашего случая.
И потом, используйте модуль НЕ mysql а именно mysqli он более производительнее, а лучше вообще PDO, на будущее больше пригодится.

kelt
04.03.2016, 22:00
Фёдор,спасибо вам за помощь. Предыдущий код работает.
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)

kelt
04.03.2016, 23:08
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");

вот такой страшный код )) Про инъекции вам уже написали выше

kelt
05.03.2016, 00:30
Азизбек Кадыров, не работает этот код. $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);

kelt
05.03.2016, 20:03
Азизбек Кадыров, Сессия создается. При успешной авторизации создается такое куки у пользователя 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

kelt
05.03.2016, 20:04
echo str_repeat("*",strlen($data['username']-5)).substr($data['username'],strlen($data['username'])-5);
Отлично. заработало с первого раза.

Азизбек Кадыров
05.03.2016, 21:58
kelt, сорри за оффтоп, как вы умудрились за 322 сообщения набрать 477 минусов? ))

kelt
06.03.2016, 10:49
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 иньекции. В сети интернет есть готовые решения но опять таки без защиты и норамльнно не работают.

kelt
06.03.2016, 11:50
Ладно понятно, как сделать тогда форму чтобы пользователь ввел сам свой $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", и соответствующие темы
Я всё ждал, когда же вы перестанете давать ему рыбу, а дадите удочку...

kelt
06.03.2016, 19:12
Дальше уже сами ) Читайте доки, stackoverflow, php.net, это будет полезней чем если мы приведем вам готовый код. Ищите "передача данных из формы в php", "поиск и обновление данных в mysql", и соответствующие темы

Вы уже сами за меня решаете что для меня будет лучше?

Азизбек Кадыров
06.03.2016, 20:35
Вы уже сами за меня решаете что для меня будет лучше?
Я не говорил что лучше, я написал что полезней )
Забесплатно, мало кто захочет ломать голову над вашими задачами

kelt
08.03.2016, 23:06
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
Мои глаза