Wątek przeniesiony 2020-02-18 14:07 z Mobilne przez Patryk27.

Problem z tworzoną aplikacją budowaną w MIT App Inventorze w połączeniu z bazą danych

0

Witam wszystkich!
Na początku dodam, że jestem totalnym samoukiem, dlatego zdecydowałem się na stworzenie aplikacji w MIT app inventorze (przyjazny interfejs, układanie api bloczkami, itd.)

Otóż, chciałem stworzyć aplikację, która będzie zbierać trzy pola: imię, miejsowość i prośba.
Posłużyłem się opisem z tego linka aby zbudować coś na ten wzór.
Jako, że mam wykupiony serwer na hekko, tam zamieściłem odpowiednie pliki php, które łączą się z bazą i które mają dodawać i wyświetlać wpisy.

plik dodaj.php

<?php

DEFINE ('DBUSER', 'user'); 
DEFINE ('DBPW', 'password'); 
DEFINE ('DBHOST', 's79.hekko.net.pl'); 
DEFINE ('DBNAME', 'baza'); 
 
$dbc = mysqli_connect(DBHOST,DBUSER,DBPW);
if (!$dbc) {
    die("Błąd połączenia z bazą danych: " . mysqli_error($dbc));
    exit();
}

$dbs = mysqli_select_db($dbc, DBNAME);
if (!$dbs) {
    die("Źle wybrana baza danych: " . mysqli_error($dbc));
    exit(); 
}

$id = mysqli_real_escape_string ($dbc, $_GET['id']);
$imie = mysqli_real_escape_string($dbc, $_GET['imie']);
$miejscowosc = mysqli_real_escape_string($dbc,$_GET['miejscowosc']);
$prosba = mysqli_real_escape_string($dbc,$_GET['prosba']);


$query = "INSERT INTO prosby (id, imie, miejscowosc, prosba) VALUES ('$id', '$imie', '$miejscowosc', '$prosba')";

$result = mysqli_query($dbc, $query) or trigger_error("Błąd bazy danych: " . mysqli_error($dbc)); 

mysqli_close($dbc); 

?>

i plik custcsv.php

<?php

DEFINE ('DBUSER', 'user'); 
DEFINE ('DBPW', 'password'); 
DEFINE ('DBHOST', 's79.hekko.net.pl'); 
DEFINE ('DBNAME', 'baza'); 
 
$dbc = mysqli_connect(DBHOST,DBUSER,DBPW);
if (!$dbc) {
    die("Database connection failed: " . mysqli_error($dbc));
    exit();
}

$dbs = mysqli_select_db($dbc, DBNAME);
if (!$dbs) {
    die("Database selection failed: " . mysqli_error($dbc));
    exit(); 
}

$result = mysqli_query($dbc, "SHOW COLUMNS FROM prosby");
$numberOfRows = mysqli_num_rows($result);
if ($numberOfRows > 0) {

$values = mysqli_query($dbc, "SELECT * FROM prosby");
while ($rowr = mysqli_fetch_row($values)) {
 for ($j=0;$j<$numberOfRows;$j++) {
  $csv_output .= $rowr[$j].", ";
 }
 $csv_output .= "\n";
}

}

print $csv_output;
exit;
?>

interfejs aplikacji wygląda tak:
https://drive.google.com/file/d/1aTw4S_rFVRaIkYKC-Z_2xnUxbVk17ial/view?usp=sharing

a schemat blokowy tak:
https://drive.google.com/file/d/13RCRt11hWlKPC8W5IugmUak-2jFT6s4A/view?usp=sharing

Problem polega na tym, że aplikacja wysyła puste rekordy do bazy danych, a jak edytuje rekordy w bazie to ich nie wyświetla. Sam plik custcsv.php wyśietla dane z rekordów ale tak:
https://drive.google.com/file/d/11kqd2MusjMcYW2LAH7jGJm0dT1OIWV4B/view?usp=sharing
a wolałbym gdyby chociaż robił to jako wpisy jeden pod drugim. Natomiast przycisk w aplikacji już nic nie wyświetla.

Co zrobić żeby api wysyłała dane a nie tylko puste rekordy i jak wyedytować plik custcsv.php aby wyświetlał dane tak jak chcę, czyli

  1. Zenek, podlasie, ....
  2. ..., ..., ...
  3. ..., ..., ...

Z góry wielkie dzięki, a za pomoc stawiam dobrą flaszkę :D

P.S. dodam tylko, że na serwerach hekko mam ustawione przyjmowanie zewnętrznych adresów ip "%" dla baz danych.

1

Co do pytania 2 to w select możesz podać tylko interesujące Cię kolumny. Np:
SELECT imię, miejscowosc FROM prosby"
Co do pierwszego pytania to ciężko powiedzieć. Ten builder nie zwraca żadnych błędów?

0
jurek1980 napisał(a):

Co do pytania 2 to w select możesz podać tylko interesujące Cię kolumny. Np:
SELECT imię, miejscowosc FROM prosby"
Co do pierwszego pytania to ciężko powiedzieć. Ten builder nie zwraca żadnych błędów?

Żadnych błędów nie wywala teraz, wcześniej gdy schemat blokowy był nieco inny, tak jak wskazałem w linku na początku pierwszego postu, to wywalało błąd Error: 1109, niewłaściwy adres url, ale po małych przeróbkach błąd nie wyskakuje, a aplikacja komunikuje się za każdym razem z bazą ale wysyła tylko puste rekordy.

Co do tego select, to jak ten kod napisać?, Samo dopisanie kolumn tabeli powoduje, że plik custcsv.php nic nie wyświetla.

0

Podmień tą linjkę:

$values = mysqli_query($dbc, "SELECT * FROM prosby");

na

$values = mysqli_query($dbc, "SELECT imie FROM prosby");

I zobacz co się zmieni.
Co do 1 pytania, to jak zasiliłeś bazę jakimiś testowymi danymi? Patrzę na to i dajesz insert na Id, najczęściej takie id nadaje się automatycznie ( baza ma autoincrement), ale wtedy miałbyś błędy.

0

po zmianie tej linijki otrzymałem takie wyświetlenie w pliku php:
Zenek| | | | Kubuś| | | | Peppa| | | | Prosiaczek| | | | Zenek| | | | Maryla| | | | Zenek| | | | Maryla| | | | | | | | | | | | | | | |
dodam tylko, że zmieniłem sobie "," na "|"

Faktycznie id ma w bazie ustawione AI więc usunąłem z pliku dodaj.php wszystko odnośnie id i aplikacja dalej dodaje wpisy ale nadal puste.

Jeśli chodzi o to jak dodałem dane testowe, to po prostu edytowałem pustekomórki w phpMyAdmin

edit:
jak zmieniłem linijkę na taką:

$values = mysqli_query($dbc, "SELECT id, imie, miejscowosc, prosba FROM prosby");

to wyświetliło wszystko. Jak teraz zrobić żeby coś takiego:

1| Zenek| podlasie| chcem być królem disco polo| 2| Kubuś| domek w lasku| Żeby mi się chciało jak mi się nie chce| 3| Peppa| świat| Chcem nowy rowerek| 4| Prosiaczek| Las| Żeby Kubuś nie wyjadał mi wszystkiego ze spiżarni| 5| Zenek| podlasie| To znowu ja, Zenek, chcem, żeby Radek nie nagrał już żadnego hitu| 6| Maryla| lat... haha 30| Chciałabym zaśpiewać nowy hit z Zenkiem| 7| Zenek| podlasie| Marylko z Tobą zawsze| 8| Maryla| :D| :*| 9| | | | 10| | | | 11| | | |

zamienić na coś takiego:

1| Zenek| podlasie| chcem być królem disco polo| 
2| Kubuś| domek w lasku| Żeby mi się chciało jak mi się nie chce| 
3| Peppa| świat| Chcem nowy rowerek| 
4| Prosiaczek| Las| Żeby Kubuś nie wyjadał mi wszystkiego ze spiżarni| 
5| Zenek| podlasie| To znowu ja, Zenek, chcem, żeby Radek nie nagrał już żadnego hitu| 
6| Maryla| lat... haha 30| Chciałabym zaśpiewać nowy hit z Zenkiem| 
7| Zenek| podlasie| Marylko z Tobą zawsze| 
8| Maryla| :D| :*| 
9| | | | 
10| | | | 
11| | | |
0

Nazwa pliku custcsv.php i zmienne sugerują, że to miało być wyjście dla pliku CSV.
Znak nowej linii dla plików tekstowych(w tym CSV) itp. to \n i masz taką linijkę:

$csv_output .= "\n";

Jeśli chcesz żeby to się wyświetlało w przeglądarce z nową linią musisz użyć znaku nowej linii z HTML : <BR>. Tylko jeśli to dalej idzie gdzieś jako CSV do innej aplikacji to taka zamiana popsuje Ci działanie gdzieś indziej.
Co do Inserta.
Zobacz czy jak wpiszesz w przeglądarkę (oczywiście wpisz swój adres):
http://adrestwojejstrony/lukas/dodaj.php?imie=4progr&miejscowosc=internet&prosba=postnaforum
i zmienisz kod na:

var_dump($_GET);
$id = mysqli_real_escape_string ($dbc, $_GET['id']);
$imie = mysqli_real_escape_string($dbc, $_GET['imie']);
$miejscowosc = mysqli_real_escape_string($dbc,$_GET['miejscowosc']);
$prosba = mysqli_real_escape_string($dbc,$_GET['prosba']);
var_dump($prosba);
die();

to co się pojawi.
W skrócie możesz poczytać o tym jak używać var_dump() -https://www.php.net/manual/en/function.var-dump
die() zatrzymuje wykonie skryptu.

0
jurek1980 napisał(a):

Nazwa pliku custcsv.php i zmienne sugerują, że to miało być wyjście dla pliku CSV.
Znak nowej linii dla plików tekstowych(w tym CSV) itp. to \n i masz taką linijkę:

$csv_output .= "\n";

Jeśli chcesz żeby to się wyświetlało w przeglądarce z nową linią musisz użyć znaku nowej linii z HTML : <BR>. Tylko jeśli to dalej idzie gdzieś jako CSV do innej aplikacji to taka zamiana popsuje Ci działanie gdzieś indziej.
Co do Inserta.
Zobacz czy jak wpiszesz w przeglądarkę (oczywiście wpisz swój adres):
http://adrestwojejstrony/lukas/dodaj.php?imie=4progr&miejscowosc=internet&prosba=postnaforum
i zmienisz kod na:

var_dump($_GET);
$id = mysqli_real_escape_string ($dbc, $_GET['id']);
$imie = mysqli_real_escape_string($dbc, $_GET['imie']);
$miejscowosc = mysqli_real_escape_string($dbc,$_GET['miejscowosc']);
$prosba = mysqli_real_escape_string($dbc,$_GET['prosba']);
var_dump($prosba);
die();

to co się pojawi.
W skrócie możesz poczytać o tym jak używać var_dump() -https://www.php.net/manual/en/function.var-dump
die() zatrzymuje wykonie skryptu.

Faktycznie dodaje do bazy te informacje tak jak piszesz.
A powiedz mi, czy ten kod który każesz podmienić to oczywiście w pliku dodaj.php i rozumiem, że chodzi tylko o dodanie var_dump($GET) i na końcu var_dump($prosba)?

edit//
po dodaniu tego do kodu wywala błąd w aplikacji

Syntax Error: quote in unquoted cell
Cannot parse text argument to "list from csv table" as CSV-formatted table

po usunięciu tego aplikacja błędu nie wywala ale dalej puszcza puste rekordy

Jeśli chodzi o CSV to faktycznie w aplikacji zrobiłem taką opcję żeby wyświetlało dodane posty, ale zmierzam do zrezygnowania z tego na rzecz wyświetlania w pliku php w przeglądarce, dlatego zależy mi na tym, żeby wpisy pokazywały się jeden pod drugim, a dalej nie mogę tego przebrnąć, bo gdy wstawiam <BR> to wywala błąd 500 na stronie.

1

Te polecenia var_dump miały Ci tylko pokazać jak wygląda tablica GET i co przychodzi Ci z przeglądarki, co idzie do bazy itd.
Poświęć chwilę spróbuj o tym poczytać:
https://www.php.net/manual/en/tutorial.forms.php lub hasła do google: php forumularz GET

Zobacz sobie tak:
zamiast:

$csv_output .= "\n";

wstaw

$csv_output .= "<BR>";

albo użyj:
https://www.php.net/manual/en/function.nl2br.php

$csv_output .= "\n";
$csv_output = nl2br($csv_output);

0

i rzeczywiście jak wstawiłem:

$csv_output .= "<BR><BR>";

to ładnie są oddzielone, o to chodziło.
A co z kwestią wysyłania pustych rekordów przez apkę? Przez modyfikację linku tekst idzie do bazy a z apki nie :/

0

Nie wiadomo jak ta apka generuje dane i połączenie. Masz dostęp do jej kodu źródłowego?

0

Sam App Inventor nie daje możliwości wglądu w kod. Spróbuję wczytać apkę w Android Studio i podeślę kod.

0

udało mi się nawiązać skutecznie połączenie z bazą danych. Przerobiłem cały formularz od nowa na podstawie tutoriala z YT z tego linku
wysyła wszystko ładnie do bazy :D (czyli przebudowałem cały kod od nowa (przez nowy układ bloczków i przerobienie pliku dodaj.php zamiast funkcji $_GET dałem $_POST)

a jeszcze z innej beczki, pomyślałem, że fajnie było by mieć możliwość zarządzania bazą z poziomu pliku custcsv.php i żeby móc dodać checkboxy do każdego wyświetlanego wpisu i móc usunąć zaznaczone wpisy oraz je edytować, czy jest to możliwe na tym kodzie? To by było coś na wzór phpmyadmin. Dodałem też przycisk drukowania, bo na tym mi zależy.
Jeszcze raz daję kod pliku:

<button onclick="window.print()">Wydrukuj prośby</button>
<BR>
<?php


DEFINE ('DBUSER', 'user'); 
DEFINE ('DBPW', 'password'); 
DEFINE ('DBHOST', 's79.hekko.net.pl'); 
DEFINE ('DBNAME', 'idatabase'); 
 
 
$dbc = mysqli_connect(DBHOST,DBUSER,DBPW);
if (!$dbc) {
    die("Database connection failed: " . mysqli_error($dbc));
    exit();
}

$dbs = mysqli_select_db($dbc, DBNAME);
if (!$dbs) {
    die("Database selection failed: " . mysqli_error($dbc));
    exit(); 
}

$result = mysqli_query($dbc, "SHOW COLUMNS FROM prosby");
$numberOfRows = mysqli_num_rows($result);
if ($numberOfRows > 0) {

$values = mysqli_query($dbc, "SELECT id, imie, miejscowosc, prosba FROM prosby");
while ($rowr = mysqli_fetch_row($values)) {
 for ($j=0;$j<$numberOfRows;$j++) {
  $csv_output .= $rowr[$j]."| ";
 }
  $csv_output .= "<BR><BR>";
}

}

print $csv_output;
exit;
?>

1 użytkowników online, w tym zalogowanych: 0, gości: 1