Повторение поля SQL в PHP

#php #mysql #sql

#php #mysql #sql

Вопрос:

Мне нужна некоторая помощь с повторным отображением поля SQL, но оно продолжает показывать ресурс # 4 или вообще ничего не показывает.

Мой код

 mysql_connect("$host", "$username", "$password") or die("cannot connect"); 
mysql_select_db("$db_name") or die("cannot select DB");
$myusername=$_POST['myusername']; 
session_register("myusername");
$result = mysql_query("SELECT statsight from playerinfo WHERE username = 'myusername'") or die(mysql_error());
$row = mysql_fetch_array($result);
if(!session_is_registered('myusername')){
    header("location:mainlogin.php");
}

echo $row['statsight'];
?>

<html>
    <body>
        Login Successful
        <form name="form2" method="post" action="stat.php">
           Stat1: <?php echo "<td>".$row['statsight']."<td>"?>
           <input type="submit" value=" ">
       </form>
    </body>
</html>
  

И это ничего не показывает. Оно отображается только Stat1: с помощью кнопки.

Значение statsight в базе данных равно 3, если это имеет значение, и myusername информация поступает из формы.

Заставил его работать с помощью

 session_start();
$myusername=$_SESSION['myusername'];
  

Комментарии:

1. session_register и session_is_registered являются устаревшими, вместо этого используйте $_SESSION суперглобальный.

Ответ №1:

 username = 'myusername'
  

здесь вы не предъявляете иск к переменной.

Я не эксперт по PHP, но это может быть правильным способом

 mysql_query("SELECT statsight from playerinfo WHERE username = ' ". $myusername."'")            or die(mysql_error());
  

Хотя это неправильный способ, вы должны использовать механизм подготовленных инструкций при выполнении запросов.

Комментарии:

1. Правильно. Также может быть полезно указать, что это уязвимо для внедрения SQL. Или, по крайней мере, получите URL сайта из OP, чтобы вы могли использовать его позже.

2. Что такое подготовленные инструкции? извините, я новичок в этом. Вы имеете в виду такие вещи, как ‘». $myusername.»‘?

3. @JordanGoh вы можете погуглить «Подготовленную инструкцию» и «Sql-инъекцию». вы найдете очень приятные и понятные статьи по обеим темам. Просто чтобы дать вам представление, для установки параметров в запросе используются подготовленные инструкции, чтобы избежать внедрения sql. и это рекомендуемый способ сделать это. Решается ли ваша проблема с использованием имени переменной в запросе?

4. @VisionarySoftwareSolutions согласен.

5. Нет. Поскольку перед этим есть страница проверки входа в систему, поэтому я думаю, что проблема заключается в переносе информации со страницы проверки входа в систему. И спасибо, что указали на ошибку в моем запросе. Также, чтобы предотвратить внедрение sql, мне просто нужно использовать косые черты и mysql_real_escape_string, верно?

Ответ №2:

Вам нужно будет использовать mysql_fetch_assoc вместо mysql_fetch_array , чтобы имена ваших полей были внесены в массив в качестве ключей $row['statsight']

Комментарии:

1. По умолчанию mysql_fetch_array извлекает строку как ассоциативный, так и числовой массив.

Ответ №3:

Вы должны ввести $ здесь ‘$myusername’

$result = mysql_query(«ВЫБЕРИТЕ statsight из playerinfo, ГДЕ username = ‘$myusername'») или die(mysql_error());

Ответ №4:

Расширение mysql больше не рекомендуется. Теперь вместо этого мы должны использовать mysqli. Хотя mysqli поддерживает подготовленные инструкции, они не нужны для простого выбора, подобного вашему. Использование PHP-функции mysqli_real_escape_string() должно быть адекватным. Для запроса insert требуется дополнительная безопасность.

Метод, который вы используете для сеансов, полностью устарел. Правильный метод показан в моем примере кода. Я думаю, что ваша ссылка настолько устарела, что является источником ваших проблем. Я рекомендую потратить некоторое время на изучение текущей копии официального руководства по PHP.

Существует несколько функций, которые можно использовать для обработки результатов запроса, который возвращает результирующий набор. Вот частичный список

 mixed mysqli_result::fetch_array ( [ int $resulttype = MYSQLI_BOTH ] ) 
// allows you to retrieve an array with numeric keys, an associative array or both
array mysqli_result::fetch_assoc ( void )
// returns an associative array of the current row
object mysqli_result::fetch_object ([ string $class_name [, array $params ]] )
// returns the current row as an object
  

Mysqli может использоваться объектно-ориентированным (OO) или процедурным способом. Большинство программ теперь используют стиль OO. Вот пример (в стиле OO).

 $mysqli = new mysqli( $host, $username, $password, $dbname );
if ($mysqli->connect_errno) 
{
    printf( "Connect failed: %sn", $mysqli->connect_error );
    exit();
} 
$_SESSION[ 'myusername' ] = $_POST[ 'myusername' ]; 
$result = $mysqli->query
    ( "SELECT statsight from playerinfo WHERE username = '".
    $mysqli->real_escape_string('myusername' )."'";
$data_array = $result->fetch_assoc();  

//$result is a mysqli_result object. 
//$data_array is an array of field_name=>value pairs.

if( !isset( $_SESSION[ 'myusername' ])) header( "location:mainlogin.php" );

echo $data_array[ 'statsight' ];
$mysqli->close();
$result->free();
?>

<html>
<body>
    Login Successful
    <form name="form2" method="post" action="stat.php">
       Stat1: <?php echo "<td>".$data_array[ 'statsight' ]."<td>"?>
       <input type="submit" value=" ">
    </form>
</body>
</html>
  

Комментарии:

1. Я получаю это, когда использую ошибку синтаксического анализа вашего кода: синтаксическая ошибка, неожиданная переменная T_VARIABLE в C:xampphtdocsprojectloginsuccess.php в строке 18 что-то не так с выборкой

2. @Jordan Goh Извините. Я пропустил точку с запятой после строки запроса, но я также думаю, что вам следует попытаться понять код вместо того, чтобы просто вырезать и вставлять. попробуйте прямо сейчас.