Найти первые n простых чисел и вставить их в базу данных (подключившись к phpmyadmin) - PullRequest
1 голос
/ 03 марта 2020

Напишите программу PHP, которая находит первые N простых чисел и записывает их в базу данных с двумя полями (идентификатор столбца и значение). Значение N вводится пользователем. Результатом должна быть страница, включающая таблицу с содержимым базы данных.

Массив с первыми n числами корректно отображается в первой строке, но Я, когда я пытаюсь вставить массив в базу данных, хранятся неправильные значения. Вместо сохранения и отображения значений «2», «3», «5», «7» в столбце «значение», , как вы можете видеть на рисунке , таблица состоит из значений « 2 'вместо фактических значений из массива. Есть предложения, что может быть не так?

Код на странице html:

<body>
<form id="form1" name="form1" method="post" action="nform.php">
<p>Finding the first n prime numbers</p>
<p>
    <label>Enter a value for N:
    <input name="n" type="text"">
    </label>
<input type="submit" name="submit" value="Submit"/>
</p>
</form>

Код во внешнем файле php (nform. php):

<html>
<head>
<title>Table</title>
</head>
<body>
<?php
//Finding first n prime numbers:
function printPrimeNumbers($n){

    $isPrime = true;
    $num = 3;
    $primeNumbers = array();

    if($n >= 1){
        $primeNumbers[] = 2;
    }

    if($n > 1){
        for($i = 2; $i<=$n;){
            for($j = 2; $j <= sqrt($num); $j++){
                if($num % $j == 0){
                    $isPrime = false;
                    break;
                }
            }

            if($isPrime) { //if $num is prime number
                $primeNumbers[] = $num;
                $i++;
            }
            $isPrime = true;
            $num++;
        }
    }
    return $primeNumbers;
}
$n = $_POST["n"];
$primeNum = printPrimeNumbers($n);

echo "First $n prime numbers are: ", implode(",", $primeNum)."<P>"; //array to string conversion
$primeNumStr = implode(",", $primeNum);


//Connecting to MySQL
$link = mysqli_connect("localhost", "root", "");
if (mysqli_connect_errno()){
    die ("Failed to connect to MySQL: " . mysqli_connect_error());
}
$query = "SHOW DATABASES";
$result = mysqli_query($link, $query);

$db_selected = mysqli_select_db($link, 'p_numbers');
if(!$db_selected){
    $query = "CREATE DATABASE p_numbers";

    //Creating table 'numbers' with 2 fields
    $query = "CREATE TABLE IF NOT EXISTS numbers(value_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, value INT NOT NULL)";
    if(mysqli_query($link, $query) == FALSE){
        die(mysqli_error($link));
    }
} else {
    mysqli_select_db($link, 'p_numbers');
}
//Inserting user input values into table 'numbers'
$query = "INSERT INTO numbers(value) VALUES ('".$primeNumStr."')";
mysqli_query($link, $query);

if(mysqli_query($link, $query) == FALSE) {
    die(mysqli_error($link));
} else {
    print("Entered value has been successfully stored.");
}

mysqli_close($link);
?>

<p>Table of stored values:</p>
<table>
    <tr>
        <td>ID</td>
        <td>Value</td>
    </tr>
</table>

<!--Selecting stored values from table 'numbers' and inserting them into a HTML table-->
<?php $link = mysqli_connect("localhost", "root", "", "p_numbers");
if (mysqli_connect_errno()){
    die ("Failed to connect to MySQL: " . mysqli_connect_error());
}

$query = mysqli_query($link, "SELECT * FROM numbers");
while($row = mysqli_fetch_row($query)){
    echo $row[0]." ".$row[1]." "."<br/>";
}

mysqli_close($link); 
?>
</body>
</html>

1 Ответ

1 голос
/ 03 марта 2020

Ваша проблема в этой строке:

$query = "INSERT INTO numbers(value) VALUES ('".$primeNumStr."')";

$primeNumStr - список через запятую; но поскольку вы заключаете его в кавычки, он рассматривается как строка. Простое решение состоит в том, чтобы удалить эти цитаты. Этого должно быть достаточно для учебного упражнения. В реальном мире вы бы провели oop через массив, вставляя каждый в отдельности с мерами предосторожности, принятыми для защиты от SQL инъекции.

Несколько других заметок. Вам не нужно продолжать закрывать и заново создавать объект подключения. Просто используйте тот же самый в течение всего сценария. Я бы порекомендовал использовать PDO, если у вас есть выбор в вашем классе. Если вы застряли с mysqli, вы должны, по крайней мере, изучить объектно-ориентированный интерфейс, который является менее многословным и подверженным ошибкам. И вы должны максимально отделять ваш PHP от вашего HTML. В идеале, в отдельном файле, но, по крайней мере, держите PHP вверху файла и HTML внизу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...