CrazyNiko Ответов: 3

Как мне решить эту "ошибку синтаксического анализа: синтаксическая ошибка, неожиданное "другое" "


<pre lang="text">
Я пытаюсь настроить "как импортировать и экспортировать CSV-файлы с помощью PHP и MySQL" с помощью shahroze.nawaz@cloudways, используя мою базу данных, но я продолжаю получать эту ошибку:

Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное 'else' (T_ELSE), ожидание конца файла в C:\xampp\htdocs\sql_download\functions.php на линии 82. Ниже приведен код от functions.php-да.
Любая помощь будет очень признательна.

0)
{
$file = fopen($filename, "r");
while (($getData = fgetcsv($file, 10000, ",")) !== ложь)
{
$sql = "вставить в pos2020 (ospos_items.name,ospos_items.unit_price,ospos_receivings_items.quantity_purchased,ospos_items_taxes.процентов,ospos_sales.sale_type) значения ('".$метода GetData[0]."','".$метода GetData[1]."','".$метода GetData[2]."','".$метода GetData[3]."','".$данные[4]".')";
$result = mysqli_query($con, $sql);
// вложенностями(mysqli_error_list($кон));
// выход();
if(!isset($result))
{
эхо "
alert(\"недопустимый файл:Пожалуйста, загрузите CSV-файл.\");
окно.местоположение = \"index.php\"
";
}
еще {
эхо "
alert(\"CSV-файл успешно импортирован.\");
окно.местоположение = \"index.php\"
";
}
}

fclose($file);
}
}

if(isset($_POST["экспорт"])){

заголовок('Content-Type: text/csv; charset=utf-8');
заголовок('Content-Disposition: attachment; filename=data.csv');
$выход = с помощью функции fopen("PHP в://выход", "ж");
fputcsv($вывода, массив('продукт', 'цена', 'количество', 'налог', 'оплачено'));
$query = "SELECT * from pos2020 ORDER BY ospos_items.name";
$result = mysqli_query($con, $query);
while($row = mysqli_fetch_assoc($result)) {
fputcsv($output, $row);
}
fclose($output);
}

функция get_all_records(){
$con = getdb();

$Sql = "SELECT * FROM pos2020";
$result = mysqli_query($con, $Sql);

if (mysqli_num_rows($result) > 0) {
эхо "

";
}

while($row = mysqli_fetch_assoc($result)) {


эхо "";

}
// эхо "";
эхо "
Продукт Цена Кол-во Налог Оплачивается
". $row['ospos_items.name"]." ". $строки['ospos_items.unit_price']." ". $строки['ospos_receivings_items.quantity_purchased']." ". $строки['ospos_items_taxes.процентов']." ". $строки['ospos_sales.sale_type']."
Экспорт
";

} еще {
echo "у вас нет последних отложенных ордеров";
}
}



?>

Что я уже пробовал:

С моими ограниченными знаниями я следовал коду и сравнивал его с оригиналом. Я пытался связаться с вами shahroze.nawaz@cloudways оригинальный автор, но не повезло. Любая помощь очень приветствуется.
Спасибо

0x01AA

Ваш код, кажется, не имеет 82 строк. В любом случае, было бы лучше, если бы вы отметили проблемную линию комментарием.

3 Ответов

Рейтинг:
1

jsc42

Хотя не конкатенация SQL-операторов-это здравый совет, он не решает ваш вопрос.

Возьмите свой код и сделайте отступ "вслепую", используя любой стандартный метод отступа, которому вас научили, например K&R или Allman. Не делайте того, что, по вашему мнению, должно выглядеть; а просто отступайте / отступайте, используя фактический текст, а именно " {"и"}". Тогда станет ясно, где и почему вы получаете сообщение.


Рейтинг:
1

OriginalGriff

Скорее всего, решение таково: Не делайте этого так. Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Исправьте это во всем вашем приложении, и у нас есть хороший шанс, что ваша проблема исчезнет в то же время.


Рейтинг:
1

Wendelius

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

Еще одно наблюдение:
- Насколько я вижу, у вас слишком много закрывающих скобок после этого fclose Однако сказать это наверняка невозможно, так как опубликованный вами код, скорее всего, не весь код.

- Что касается вставки и операторов, то, похоже, у вас есть дополнительные обозначения в операторах. Например

INSERT into pos2020 (ospos_items.name,ospos_items.unit_price, ...

При перечислении столбцов вы должны иметь только имена целевых столбцов, возможно, что-то вроде
INSERT into pos2020 (name, unit_price, ...

То же самое относится и к предложению ORDER BY use use later on