Kirjautuminen

Haku

Tehtävät

Kilpailu

Putka Open 2025
Kilpailu on päättynyt.

Keskustelu: Ohjelmointikysymykset: PHP tulostusongelma

Tittis [11.12.2025 18:06:17]

#

Pitäisi saada rivinvaihtonuoli Viopessa näkymään rivin jälkeen omalla rivillään, ei rivin perässä.

Voisko joku jeesiä, kiitos!

EDIT: jotenkin \r\n joko muuttujaan tallennettuna ja/tai echo tulostettuna
mutta miksi ei toimi eri testailujen mukaan (Windows-ympäristö (ja Viope) odottaa usein CRLF-rivinvaihtoa)

ps. olen tänä vuonna pikkuhiljaa tutustunut tähän PHP-kieleen - joskus tutustunut C- ja Java-kieliin mutta niistä aikaa

<?php

// Määritä tiedoston nimi
$tiedosto = 'asiakasrekisteri.txt';

// Lue GET-parametrit
$mode          = $_GET['mode'] ?? '';
$asiakasnumero = $_GET['asiakasnumero'] ?? ($_GET['asiakas'] ?? '');
$nimi          = $_GET['nimi'] ?? '';
$osoite        = $_GET['osoite'] ?? '';

// Jos mode on "save": lisätään asiakas
if ($mode === 'save') {
    // Puhdista syötteet
    $asiakasnumero = trim(strip_tags($asiakasnumero));
    $nimi          = trim(strip_tags($nimi));
    $osoite        = trim(strip_tags($osoite));

    // Jos kaikki kentät ovat ei-tyhjiä
    if ($asiakasnumero !== '' && $nimi !== '' && $osoite !== '') {
        // Muodosta rivi muodossa asiakasnumero##nimi##osoite
        $rivi = $asiakasnumero . "##" . $nimi . "##" . $osoite . "\n";

        // Avaa tiedosto lisäystilassa ('a')
        $viite = fopen($tiedosto, 'a');
        if ($viite) {
            // Kirjoita rivi tiedoston loppuun
            fwrite($viite, $rivi);
            // Sulje tiedosto
            fclose($viite);
        }
    }

} elseif ($mode === 'delete') {
    // Asiakkaan poisto
    if ($asiakasnumero !== '' && file_exists($tiedosto)) {
        // Avaa tiedosto lukutilassa ('r')
        $viite = fopen($tiedosto, 'r');
        $uudet = []; // Luo uusi lista

        if ($viite) {
            // Lue rivit yksi kerrallaan
            while (($rivi = fgets($viite)) !== false) {
                $rivi = trim($rivi);
                if ($rivi === '') continue;

                // Erottele kentät rivistä
                $osat = explode("##", $rivi, 3);

                // Jos rivin asiakasnumero ei ole sama kuin poistettava
                if ($osat[0] !== $asiakasnumero) {
                    $uudet[] = $rivi;
                }
            }
            fclose($viite);
        }

        // Avaa tiedosto kirjoitustilassa ('w')
        $viite = fopen($tiedosto, 'w');
        if ($viite) {
            // Kirjoita uudet rivit tiedostoon
            foreach ($uudet as $rivi) {
                fwrite($viite, $rivi . "\n");
            }
            fclose($viite);
        }
    }

} else {
    // Asiakkaan haku
    if ($asiakasnumero !== '' && file_exists($tiedosto)) {
        // Avaa tiedosto lukutilassa ('r')
        $viite = fopen($tiedosto, 'r');
        if ($viite) {
            // Lue rivit yksi kerrallaan
            while (($rivi = fgets($viite)) !== false) {
                $rivi = trim($rivi);
                if ($rivi === '') continue;

                // Erottele kentät rivistä
                $osat = explode("##", $rivi, 3);

                // Jos kenttiä on kolme ja asiakasnumero täsmää
                if (count($osat) === 3 && $osat[0] === $asiakasnumero) {
                    $nimi   = trim($osat[1]);
                    $osoite = trim($osat[2]);

                    // Tulosta täsmälleen muodossa
                    echo "Asiakas: " . $nimi . ", " . $osoite . "\n";

                    break; // vain yksi osuma
                }
            }
            fclose($viite);
        }
    }
}
?>

Metabolix [29.12.2025 07:20:45]

#

Mahdoton sanoa tuon perusteella, mitä Viope odottaa. Lue Viopen ohjeet ja esimerkit tarkkaan, kai sieltä täytyy löytyä selitys.

Tuossa koodissa on aika vakavia ongelmia, mm. jos syöte sisältää rivinvaihdon tai merkit ##. Hauska nähdä, että Viope on tyylilleen uskollinen ja opettaa myös PHP:tä päin mäntyä 2000-luvun alun tyyliin.

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta