У меня есть сайт, назовем его phone.names.xol.com. Используя веб-сайт, у меня проблема со входом
Там я создал базу данных с именем backe.Пароль 1234. (Можно поделиться паролем). В этой базе данных (backe) у меня есть имя таблицы это пользователи. Мой сокет — «home/tiger/mysql/run/mysql.sock».
Через локалхост - все работает
Я создал на локальном хосте имя базы данных с именем таблицы пользователей. Пользователь root, пароль пустой. Я могу войти на эту страницу без проблем.
Это connection.php. Он находится внутри файла с именем b, поэтому b/connection.php
<?php
$host='phones.names.xol.com';
$db = 'backe';
$user='root';
$pass='1234';
if (gethostname()=='phones.names.xol.com') {
$mysqli = new mysqli($host, $user, $pass, $db,null,'home/tiger/mysql/run/mysql.sock');
} else {
$mysqli = new mysqli($host, $user, $pass, $db);
}
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" .
$mysqli->connect_errno . ") " . $mysqli->connect_error;
}
// Check connection
if (!$mysqli) {
die("Connection failed: " . mysqli_connect_error());
}{
echo "Connected successfully to database";
}
function check_login($mysqli)
{
if (isset($_SESSION['user_id']))
{
$id = $_SESSION['user_id'];
$query = "select * from users where user_id = '$id' limit 1";
$result = mysqli_query($mysqli,$query);
if ($result && mysqli_num_rows($result) > 0){
$user_data = mysqli_fetch_assoc($result);
return $user_data;
}
}
}
function random_num($length){
$text = " ";
if ($length < 5 ){
$length = 5;
}
$len = rand(4,$length);
for ($i=0; $i < $len; $i++){
$text .= rand(0,9);
}
return $text;
}
?>
В файле login.php я даю основные части кодов, которые у меня есть.
<?php
session_start();
include("b/connection.php");
if ($_SERVER['REQUEST_METHOD'] == "POST")
{
//something was posted
$user_name = $_POST['user_name'];
$password = $_POST['password'];
if (!empty($user_name) && !empty($password) && !is_numeric($user_name))
{
$user_id = random_num(20);
$query = "insert into users ( user_id,user_name,password) values ('$user_id','$user_name','$password')";
mysqli_query($mysqli, $query);
header("Location: index.html");
die;
}
else{
echo "Please enter some valid information!";
}
}
?>
и это форма этого кода как
<form method = "post" >
Username: <input type = "text" name = "user_name"/>
<br/>
Password: <input type = "password" name = "password" />
<br/>
<input type = "submit" value = "Login"/><br><br>
</form>
Как я могу заставить его работать по ссылке (скажем, https:\www.phones.names.xol.com), как это работает на локальном хосте? Я пытался это сделать в течение нескольких часов, но мне не удалось. База данных хороши, проблема, я думаю, в b/connection.php.
Какие именно ошибки вы получаете, когда пробуете это в размещенной среде?
ПРЕДУПРЕЖДЕНИЕ: Написание уровня управления доступом — непростая задача, и есть много возможностей сделать это серьезно неправильно. Любая современная среда разработки , такая как Laravel , имеет встроенную систему аутентификации . Как минимум следуйте рекомендациям по обеспечению безопасности и никогда не храните пароли в виде простого текста или слабого хэша, такого как SHA1 или MD5.
$host
обычно просто 'localhost'
. Конечно, вы должны использовать подготовленные операторы.
Создание случайных чисел для вашего user_id
кажется плохим планом. Почему бы не использовать столбец AUTO_INCREMENT
?
@tadman да, действительно. но в любом случае проблема не в этом
Если вы подключаетесь к локальному сокету:
$mysqli = new mysqli('localhost', $user, $pass, $db, null, '/home/tiger/mysql/run/mysql.sock');
Я предполагаю, что это предназначено для передачи /host
, а не относительного пути, такого как host
.
привет, я должен заменить ваш ответ этим $mysqli = new mysqli($host, $user, $pass, $db,null,'home/tiger/mysql/run/mysql.sock');?
$host
является частью проблемы здесь. Так и должно быть 'localhost'
. Домен сайта совершенно не имеет значения, если вы используете локальный сокет.
Вы также должны проверить этот путь. Я почти уверен, что это должно быть /home/...
, если только по какой-то странной причине у вас нет буквального home
пути относительно вашего веб-корня.
Он показывает мне строку ошибки 22: это строка с сокетом $mysqli = new mysqli('localhost', $user, $pass, $db,null,
Какая ошибка, конкретно? Пожалуйста, включите полный текст.
строка 34: $mysqli = new mysqli('localhost', $user, $pass,$db); if ($mysqli->connect_errno) { echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; }
ошибка: (HY000/2002): нет такого файла или каталога и всего пути к нему
Если вам нужно подключиться через сокет, вы должны указать путь к сокету. В этой строке нет.
Еще раз подтвердите путь. Я почти уверен, что это /home/...
нет home/...
да, это /home, а не home... в строке 22 у меня есть это сообщение об ошибке: mysqli::__construct(): (HY000/1045): доступ запрещен для пользователя 'root'@'localhost' (используя пароль: НЕТ)
$ пользователь = 'корень'; $ пройти = ''; $host='локальный'; $db = 'назад'; это то, как я определяю их
➟ ➡︎ Подтвердите путь к сокету.
'/home/tiger/mysql/run/mysql.sock' это так..
Хорошо, теперь обязательно используйте это в своем вызове new
. Этот код, который вы показываете, использовал его неправильно.
Я использовал этот /home/tiger/mysql/run/mysql.sock и получал эти ошибки
Если он говорит, что путь не найден, это может быть неправильно, вам нужно подтвердить это и, возможно, скорректировать его на основе информации, которую только вы можете найти. Я не могу больше помочь. Обычно это включает в себя вход в систему на рассматриваемой машине и использование таких инструментов, как ls
или find
, чтобы определить, где находится этот сокет.
Предупреждение: mysqli::__construct(): (HY000/1045): доступ запрещен для пользователя 'root'@'localhost' (используя пароль: НЕТ) вы имеете в виду, что это означает, что мой сокет неверен?
ребята, это сработало, я удаляю строки, у меня была проблема, ваш ответ работает нормально. Большое спасибо за вашу помощь.
ВНИМАНИЕ: при использовании
mysqli
вы должны использовать параметризованные запросы и bind_param для добавления любых данных в ваш запрос. НЕ ИСПОЛЬЗУЙТЕ для этого интерполяцию или конкатенацию строк, потому что вы создали серьезную ошибку SQL-инъекций. НИКОГДА не помещайте$_POST
,$_GET
или какие-либо данные непосредственно в запрос, это может быть очень вредно, если кто-то попытается воспользоваться вашей ошибкой.