Wollte es unter root laufen lassen, konnte aber nirgends ein Passwort für den root finden. Dann ein Passwort vergeben aber in FTP komm ich mit dem root auch nicht rein.
Habs also unter pi am laufen.
Mit "sudo su" bekommt man Rootrechte, aber mehr weiß ich im Moment so auch nicht
Du rufst dein Script im Moment mit python ...../python_datei.py & aus der rc.local auf ?
Was passiert wenn du sudo python ..../.... schreibst ?
Dann brauch ich mich nicht zuerst in der Konsole anmelden ![]()
XD
Mal ne Frage zu MySQL und PHP...
Hier der PHP Teil:
<?php
//include_once('ardudome.php');
header("Content-Type: text/html; charset=utf-8");
$display_errors = true;
if($display_errors == true) {
ini_set('display_errors', '1');
error_reporting(E_ALL);
} else {
ini_set('display_errors', '0');
error_reporting(0);
}
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'mypass';
$db_name = 'test';
//$created_date = date("Y-m-d H:i:s");
$pin = $_GET['pin'];
$cmd = $_GET['cmd'];
$DBH = new PDO('mysql:host='.$db_host.';dbname='.$db_name, $db_user, $db_pass);
$sth = $DBH->prepare("INSERT INTO slave (Pin, Value) VALUES ('$pin', '$cmd')");
//$sth->bindParam(':to_arduino', $_POST['send_to_arduino']);
$sth->execute();
$send = "String: '".$_POST['pin']."' gesendet
";
/* if(mysql_query("INSERT INTO slave VALUES('$pin', '$cmd', '$created_date')"))
echo "Successfully Inserted";
else
echo "Insertion Failed";
$ergebnis = mysqli_query($db, "SELECT Pin FROM slave");
while($row = mysqli_fetch_object($ergebnis))
{
echo $row->Pin;
echo "
";
echo $row;
}
*/
?>
Ich nehme immer noch den Ardudome Beispiel zur Hand:
<!DOCTYPE html>
<html>
<head>
<title>ArduDome</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="../images/conference-room.png"/>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css" />
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
<link rel="stylesheet" href="ardudome.css" />
</head>
<body>
<div data-role="page" data-title="ArduDome" id="ardudome-page">
<div data-theme="d" data-role="header">
<h1>
ArduDome
</h1>
</div>
<div data-role="content">
<div class="content-primary">
<div class="s-title"><center>Outputs</center></div>
<ul data-role="listview" data-inset="true" >
<li>
<label for="P02"><b>OUT 02</b></label>
<select name="P02" id="P02" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P03"><b>OUT 03</b></label>
<select name="P03" id="P03" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P04"><b>OUT 04</b></label>
<select name="P04" id="P04" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P05"><b>OUT 05</b></label>
<select name="P05" id="P05" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P06"><b>OUT 06</b></label>
<select name="P06" id="P06" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P07"><b>OUT 07</b></label>
<select name="P07" id="P07" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P08"><b>OUT 08</b></label>
<select name="P08" id="P08" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
</ul>
</div>
<div class="content-secondary">
<div class="s-title"><center>Inputs</center></div>
<ul data-role="listview" data-inset="true" >
<li>
<label><b>IN A0</b></label>
<span class="inputvalue" name="P14" id="P14">0</span>
</li>
<li>
<label><b>IN A1</b></label>
<span class="inputvalue" name="P15" id="P15">0</span>
</li>
</ul>
</div>
<!-- <button id="test">Test</button> -->
</div>
<div data-theme="d" data-role="footer">
<h1>by Luca Soltoggio</h1>
</div>
</div>
</body>
</html>
Wenn ich nun das PHP aufrufe, bekomme ich diesen Fehler:
Notice: Undefined index: pin in /var/www/matrix/updateInfo.php on line 22
Notice: Undefined index: cmd in /var/www/matrix/updateInfo.php on line 23
Notice: Undefined index: pin in /var/www/matrix/updateInfo.php on line 32
Wäre dann dass hier:
$pin = $_GET['pin'];
$cmd = $_GET['cmd'];
Wie ich nun denke, weiß PHP mit ['pin'] und ['cmd'] nix anzufangen.
Wenn ich aber da was anderes reinschreibe, bekomme ich keine Einträge in MySQL.
Und was mich noch wundert, wenn PHP von pin und cmd nix weiß, woher weiß es dann was in MySQL eingetragen werden muss?
Hier der MySQL Eintrag:
Hi, erstmal ist alles so wie es ist lauffähig.
(Es sind nur Hinweise auf nicht saubere Programmierung, keine Warnungen oder Fehler)
Die Begründung ist etwas länger.
Man sollte die Clientseite und die Serverseite immer getrennt voneinander betrachten. Der Client schickt Daten über POST. GET, COOKIE, oder andere Schnittstellen. Die Daten die der Server irgendwie von Clienten empfängt sollten als erstes als "böse" betrachtet werden. Es funktioniert zwar beim lernen von PHP auch ohne Überprüfung aber so erzeugt man Schwachstellen.
Z.B. ein Html-Formular sendet nur Daten an den Server, sobald man auf Senden druckt, bzw das Formular abgeschickt wird. Oder die Eingabe von Parametern über die URL im Browser ist ja nicht zwingend nötig, nur wenn irgendetwas erreicht werden soll:
- jomelo.de/
-
jomelo.de/?userid=10
Der Server erwartet also ab und zu die Variable $_GET['userid'] diese ist aber nicht immer gesetzt.
So ist es bei dir mit deinen Variablen "pin" und "cmd".
PHP bietet nun die Möglichkeiten soetwas zu überprüfen mit:
<?php
if(isset($_GET['pin'])) {
// pin gesetzt
}
Nun tritt der Hinweis den du bekommst nicht mehr auf, aber die Daten sind immernoch böse, da in $_GET['pin'] ja auch z.B. "<?php exit; ?>" drin stehen könnte. Würdest du diesen String in der Datenbank speichern und später wieder ausgeben würde dein PHP Script an der Stelle der Ausgabe beendet werden. Daher solltest du die Variablen die du erwartest genau überprüfen.
Dann ist es so wie du schon bemerkt hast, das php nicht weiß welche Variablen vom Clienten gesendet werden und welche nicht. z.B. sollte in der Variable nur ein int wert stehen und in cmd vermutlich nur ein String ohne Sonderzeichen.
Bei mir sieht die Verarbeitung von daten z.B. wie folgt aus:
<?php
//.....
if (isset($_GET['pin']) && isset($_GET['cmd']))
{
// Werte vollständig ausgefüllt
$_GET['pin'] = trim($_GET['pin']); // entfernt Leerzeichen vor und hinter dem String
//mit ltrim und rtrim könnte man links und rechts Leerzeichen entfernen z.B. Zuviel eingegeben
if(empty($_GET['pin'])) {
// Meldung nicht gesetzt
} else {
// Variable nicht leer, nun den Inhalt überprüfen
// überprüfen ob Zahl
$pattern = '/^[0-9]*$/';
if(preg_match($pattern, $_GET['pin']) == false) {
// Fehler, Eingabe ist keine Zahl
}
//überprüfen ob String mit ausgewählten Sonderzeichen
$pattern = '/^[a-zöüäß[:space:]\-]*$/i';
if(preg_match($pattern, $_GET['pin']) == false) {
// Fehler, Eingabe entspricht nicht den vorgaben
}
// Die erwartete länge sollte überprüft werden:
if(strlen($_GET['pin']) > 0 && strlen(...) < xxx) {
// ....
}
// nun lässt sich hier noch viel mehr Filtern, aber einem sollte klar sein, das immer gefiltert werden muss
// jede Schwachstelle gefärdet die Stabilität des Systems
// .. Weiter zur Datenbank
}
}
?>
Filtern kann man in PHP mit Reguläre Ausdrücke oder mit den eingebauten Filterfunktion filter_input(...) oder mit direkten Funktionen:
- is_numeric
- is_char
- is_object
....
Nun zur Datenbank. Ich habe in diesem Beispiel speziell schon den PDO Treiber für den Zugriff gewählt, man kann auch den Zugriff über Mysqli durchführen, diese Klasse ist in etwa gleichwertig. Jedem liegt das seine.
Im Internet findet man aber auch viele Beispiel wo noch der Zugriff über die direkten Mysql Funktionen stattfindet.
mysql_connect, mysql_query, ....
Dies ist nicht zu empfehlen, da hier jede Eingabe in die Datenbank über INSERT ... noch selbst auf SqlInjektions gefiltert werden muss. Bei den beiden genannten klassen, PDO und Mysqli können Daten als Parameter mit (PDO)
- $sth->bindParam('bezeichnung', $parameter)
- $sth->bindValue('bezeichner', $value)
und weiteren Funktionen zum Query (INSERT, UPDATE, ...) hinzugefügt werden. Sql Injektions werden dadurch minimiert.
Beispiel:
<?php
//...
$sth = $dbh->prepare("INSERT INTO xx_table (id, wert1, wert2) VALUES (:id, :wert1, :wert2)");
$sth->bindParam(':id', $x_value);
//...
$sth->execute()
?>
Die Filter Funktionen lassen sich auch super in eigenen Funktionen auslagern oder man wendet gewisse Filter direkt auf alle Eingaben an bevor man diese dann Filtert.
Beispiel: Alle Leerzeichen in _GET Variablen enfternen, die vor oder hinter den Eingaben ausversehen eingegeben wurden:
<?php
//ausgabe des Inhaltes von $_GET
echo "<pre>"; // schöne Formatierung
print_r($_GET]);
echo "</pre>";
// Alle Leerzeichen entfernen
if(count($_GET) > 0) { // Überprüfen ob Inhalt vorhanden ist
foreach($_GET as $key => $value) {
$_GET[$key] = trim($value);
}
}
//ausgabe des Inhaltes von $_GET gefiltert
echo "<pre>"; // schöne Formatierung
print_r($_GET]);
echo "</pre>";
// Die Überprüfung ob eine Bestimmte Variable gesetzt ist muss weiterhin stattfinden
if(isset($_GET['pin'])) {
//...
?>
Genauso könnte man das mit POST und COOKIE und anderen Schnittstellen machen.
In PHP ist es eventuell noch interesannt zu wissen das es einen unterschied zwischen true = 1 und true == 2 gibt.
<?php
$var = 3
if($var == true) {
// ist erfüllt, da die Variable einen Wert größer als 0 hat
}
if($var) {
// ist erfüllt, da die Variable einen Wert größer als 0 hat
// Die Abfrage ist aquivalent zu der oberen
}
if($var === true) {
// ist nicht erfüllt, da die Variable keinen boolen Wert hat
}
?>
Die Überprüfung der Eingangsvariablen sollte übrigens nicht nur in PHP sondern auch in Python, C, C++, C# und allen anderen Programmiersprachen durchgeführt werden. Alle Eingaben von woanders sind erstmal als "böse" zu betrachten.
In Python sieht die isset Abfrage wie folgt aus:
try:
//mach was
except:
// hat nicht geklappt
// mit except e: kann man mit print e die Fehlermeldug ausgeben, die bei try abgefangen wurde ausgeben lassen oder weiterverarbeiten
In PHP gibts dann try: catch: ... aber diese Programmierung lohnt sich nur, wenn die PHP Kenntnisse schon unter Fortgeschritten / Profi einzusoriteren sind.
So, ich hoffe das Hilft dir und auch anderen etwas weiter.
PS: Auf den Quellcode kann ich keine Garantie geben, ich hab den gerade frei ohne testen hier geschrieben, daher auch die Einrückfehler.
Hi.
Also zB $dbh->prepare oder $sth->execute() habe ich in meinen tutorials nicht entdecken können.
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'mypass'; // <-------- anpassen
$db_name = 'test';
//$created_date = date("Y-m-d H:i:s");
$pin = $_GET['pin'];
$cmd = $_GET['cmd'];
$DBH = new PDO('mysql:host='.$db_host.';dbname='.$db_name, $db_user, $db_pass);
$sth = $DBH->prepare("INSERT INTO slave (Pin, Value) VALUES ('$pin', '$cmd')");
$ergebnis = mysqli_query($db, "SELECT * FROM slave");
while($row = mysqli_fetch_object($ergebnis))
{
echo "$row->Pin"."
";
}
Hatte mal so probiert, da nach meinem Verständniss die Verbindung schon steht. Hatte aber den Hinweis, keine Berechtigung oder keine Verbindung.
<?php
//...
$sth = $dbh->prepare("INSERT INTO xx_table (id, wert1, wert2) VALUES (:id, :wert1, :wert2)");
$sth->bindParam(':id', $x_value);
//...
$sth->execute()
?>
Besagt das $sth->execute() dass $sth->bindParam(':id', $x_value); ausgeführt werden soll?
// Prozedural
$mysqli = mysqli_connect('host', 'user', 'pw', 'db');
$query = 'INSERT INTO bla (blubb, blubber) VALUES (?, ?)';
$stmt = mysqli_prepare ($mysqli, $query);
$stmt -> bind_param('is', $blubb, $blubber);
Wozu braucht man das bind_param? Geht das nicht so?
$query = 'INSERT INTO bla (blubb, blubber) VALUES ($blubb, $blubber)';
Alles wegen der Sicherheit?
Hi,
die Fehlermeldung kommt, da bei mir $dbh klein geschrieben ist, aber in PHP vorher mit $DBH deklariert wurde. Daher fehlen die Rechte.
Wenn du es so machst:
$query = 'INSERT INTO bla (blubb, blubber) VALUES ($blubb, $blubber)';
und einen Filter auf irgend einen neuen Hack vergessen solltest, dann schreib ich z.B. in $blubb einen String rein der z.B. für mich einen neuen Root User anlegt über den ich dir dann alle Daten klauen könnte, inklusive Passwörter: mehr dazu: SQL-Injection – Wikipedia
Unglücklicherweise ist es mit PHP 4.x einzig Sache des Programmieres vor SQL-Injektion sicheren Programmcode zu schreiben, erst PHP 5.1 bringt die Möglichkeit PDO zu nutzen und stellt damit ein sicheres SQL-Interface zur Verfügung.
Quelle: SQL Injektion :: PHP Sicherheit :: das Blog rund um Security im Content Management System
Es gibt mittlerweile auch andere Datenbank Klassen die damit umgehen können.
Zweiter Grund:
PDO ist wesentlich kompakter vom Code her => der Code ist später einfacher wartbar.
Dritter Grund:
Nicht nur Mysql wird unterstützt, falls man später die Datenbank wechselt, bleibt der Code gleich
Vierter Grund:
Mit Objekten und Klassen zu arbeiten sorgt später dafür das der Code einfacher wartbar wird, bzw sich neue Programmierer schneller einarbeiten können insofern alles Dokumentiert ist
Bei deinem ersten Versuch eben, hattest du die pdo und mysqli Klasse untereinander vermischt.
Ich will es so machen, beim ersten Eintrag in MySQL soll INSERT INTO gemacht werden und danach nur UPDATE.
Somit habe ich keine millionen von Einträgen.
Irgendwie bin ich ganz auf dem Holzweg ![]()
Hier wird die Verbindung hergestellt:
$DBH = new PDO('mysql:host='.$db_host.';dbname='.$db_name, $db_user, $db_pass);
Ich nehme an so wäre es nicht "sicher", oder?
$DBH = new PDO('localhost', 'root', 'mypass', 'test');
Verbindung herstellen und Daten( pin, cmd) in die Tabellen Pin und Value schreiben.
$sth = $DBH->prepare("INSERT INTO slave (Pin, Value) VALUES (:pin, :cmd)");
Hier hab ich überhaupt kein Plan wozu es ist. Ich hab doch schon vorhin ("INSERT INTO slave (Pin, Value) VALUES (:pin, :cmd)"); ausgeführt?!
$sth->bindParam(':Pin', $gpin);
$sth->execute();
Das Array $sth soll ausgeführt werden, nur welches? $sth->bindParam(':Pin', $gpin);
oder
$sth = $DBH->prepare("INSERT INTO slave (Pin, Value) VALUES (:pin, :cmd)");
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Inizialize message string to send to Arduino
//$message="/";
// If is coming some command from jQuery web page convert name like "P03" in "03" and value like "1" in "H"
if (isset($_GET['pin']) && isset($_GET['cmd'])) {
if ($_GET['cmd']=="0") $gcmd="L"; elseif ($_GET['cmd']=="1") $gcmd="H"; else $gcmd="/";
if ((strlen($_GET['pin'])==3) && (substr($_GET['pin'],0,1)=="P")) {
if (intval(substr($_GET['pin'],-2))<=13 && intval(substr($_GET['pin'],-2))>=2) $gpin=substr($_GET['pin'],-2); else $gpin="";
// $message="/*CMD".$gpin.$gcmd."/"; // create message string
}
}
// create message for sending and getting data to Arduino
for ($i = 2; $i<=19; $i++) {
$pin = sprintf('%02s', $i);
//$message=$message."*CMD".$pin."V/";
}
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'mypass'; // <-------- anpassen
$db_name = 'test';
$DBH = new PDO('mysql:host='.$db_host.';dbname='.$db_name, $db_user, $db_pass);
//Daten in Datenbank eintragen
$sth = $DBH->prepare("INSERT INTO slave (Pin, Value) VALUES (:pin, :cmd)");
$sth->bindParam(':Pin', $gpin);
$sth->execute();
// creato json string
echo json_encode($myArray);
?>
<!DOCTYPE html>
<html>
<head>
<title>ArduDome</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="../images/conference-room.png"/>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css" />
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
<link rel="stylesheet" href="ardudome.css" />
</head>
<body>
<div data-role="page" data-title="ArduDome" id="ardudome-page">
<div data-theme="d" data-role="header">
<h1>
ArduDome
</h1>
</div>
<div data-role="content">
<div class="content-primary">
<div class="s-title"><center>Outputs</center></div>
<ul data-role="listview" data-inset="true" >
<li>
<label for="P02"><b>OUT 02</b></label>
<select name="P02" id="P02" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P03"><b>OUT 03</b></label>
<select name="P03" id="P03" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P04"><b>OUT 04</b></label>
<select name="P04" id="P04" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P13"><b>OUT 13</b></label>
<select name="P13" id="P13" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
</ul>
</div>
<div class="content-secondary">
<div class="s-title"><center>Inputs</center></div>
<ul data-role="listview" data-inset="true" >
<li>
<label><b>IN A0</b></label>
<span class="inputvalue" name="P14" id="P14">0</span>
</li>
<li>
<label><b>IN A1</b></label>
<span class="inputvalue" name="P15" id="P15">0</span>
</li>
<li>
<label><b>IN A5</b></label>
<span class="inputvalue" name="P19" id="P19">0</span>
</li>
</ul>
</div>
<!-- <button id="test">Test</button> -->
</div>
<div data-theme="d" data-role="footer">
<h1>by Luca Soltoggio</h1>
</div>
</div>
<script src="ardudome.js"></script>
</body>
</html>
ardudome.js
var visibleFlag = 1;
// get and parse json data from PHP file and update HTML page
function get_arduino_data() {
if (visibleFlag) {
var jqxhr = $.getJSON('ardudome.php?' + 'random=' + Math.random(), function(data) {
// call value_update function passing json variable
value_update(data);
$("[data-role='slider']").slider('enable');
$('label').css('color','#333');
$('.ui-bar-d').css('color', '#333');
$('.inputvalue').css('color','coral');
$('.s-title').css('color','#333');
})
/* .error(function() {
$("[data-role='slider']").slider('disable');
$('label').css('color','#BBBBBB');
$('.ui-bar-d').css('color', '#BBBBBB');
$('.inputvalue').css('color','#BBBBBB');
$('.s-title').css('color','#BBBBBB');
});
*/
}
}
// call PHP file sending "pin" & "cmd" got from HTML page, and update
function set_arduino_data(pname,pvalue) {
$.getJSON('ardudome.php?pin=' + pname + '&cmd=' + pvalue + '&random=' + Math.random(), function(data) {
value_update(data);
});
$.post('test.php?pin=' + pname + '&cmd=' + pvalue + '&random=' + Math.random(), function(data) {
});
}
// if a slider changed, this funciont will call the function above using as "pname" the name of
// modified slider and as "pvalue" the actual value of the slider (0 or 1)
function detect_changes() {
$("[data-role='slider']").change(function() {
set_arduino_data($(this).attr("name"),$(this).val());
});
}
// function for parsing json data and updating HTML page
// this will update slider status and label value
function value_update(data) {
$.each(data, function (index, value) {
if(parseInt(index)<=13) {
$('#P'+index).val(value).slider("refresh");
}
else
{
$('#P'+index).text(value);
}
});
}
// function for checking if the page is visible or not
// (if not visible it will stop updating data)
function checkVisibility() {
$(window).bind("focus", function(event) {
visibleFlag = 1;
});
$(window).bind("blur", function(event) {
visibleFlag = 0;
});
}
// start all above every 5 seconds
$(document).ready(function(){
get_arduino_data();
detect_changes();
setInterval('get_arduino_data()', 5000);
checkVisibility();
});
function loadProperties(){
$.getJSON('properties.json?'+ new Date().getTime(), function(data) {
//alert ("I am here!");
$('#A').val(data.switchState_A).slider('refresh');
$('#B').val(data.switchState_B).slider('refresh');
$('#C').val(data.switchState_C).slider('refresh');
});
}
EDIT:
Sind wohl einfach nur Platzhalter: VALUES (:pin, :cmd)
$sth = $DBH->prepare("INSERT INTO slave (Pin, Value) VALUES (:pin, :cmd)");
Hier werden die Platzhalter mit $gpin und $cmd ersetzt und anschließend INSERT ausgeführt.
$sth->bindParam(':pin', $gpin);
$sth->bindParam(':cmd', $cmd);
$sth->execute();
Gibts da ein unterschied, wenn man ein ? als Platzhalter hinschreibt?
Ich nehme an so wäre es nicht "sicher", oder?
$DBH = new PDO('localhost', 'root', 'mypass', 'test');
Das geht so direkt nicht, aber du könntest die Variablen auch direkt in den Verbindungsaufbau schreiben. Nur ist es immer einfacher wenn man sich eine Konfigurationsdatei bastelt in der man solche Daten auslagert, sobald man später etwas ändern muss, muss nicht der komplette Quellcode durchsucht werden.
<?php
$DBH = new PDO('mysql:host=localhost;dbname=test', 'root', 'pass');
Bei PDO wird eine Abfrage erst mit execute ausgeführt. Alles was vorher mit prepare passiert, generiert den Sql Code für die Abfrage / das Sql Statement
$sth->execute();
Das Array $sth soll ausgeführt werden, nur welches? $sth->bindParam(':Pin', $gpin);
oder
$sth = $DBH->prepare("INSERT INTO slave (Pin, Value) VALUES (:pin, :cmd)");
$sth ist kein Array sondern ein Objekt. Das Objekt besteht aus dem Statement welches von $DBH->prepare zurückgegeben wird.
Folgende Methoden sind in den beiden Klassen vorhanden
Pdo Objekt: PHP: PDO - Manual
Pdo Methoden: PHP: PDO::prepare - Manual (linke Seite)
PdoStatement Klasse: PHP: PDOStatement::bindColumn - Manual (linke Seite)
EDIT:
Sind wohl einfach nur Platzhalter: VALUES (:pin, :cmd)
$sth = $DBH->prepare("INSERT INTO slave (Pin, Value) VALUES (:pin, :cmd)");Hier werden die Platzhalter mit $gpin und $cmd ersetzt und anschließend INSERT ausgeführt.
$sth->bindParam(':pin', $gpin);
$sth->bindParam(':cmd', $cmd);
$sth->execute();
Gibts da ein unterschied, wenn man ein ? als Platzhalter hinschreibt?
Das mit dem Platzhalter stimmt. Ich denke man kann andere Zeichen als Platzhalter verwenden, bin mir da aber nicht ganz sicher, da ich es nie ausprobiert habe.
Im Moment sind es wohl ein paar zuviele Informaten gleichzeit und dazu noch Sprachen in denen du dich nur wenig auskennst, aber durch probieren kommt man da schnell rein ![]()
Ansonsten immer weiter fragen ![]()
Und wie tuht man die Wechselumschalter aus der Datenbank Updaten?
Bei den Checkboxen klappts, nur die Umschalter machen Probleme.
<?php
$id = "1";
$tabellenname = "fuss";
$link = mysql_connect("localhost", "root", "mypass");
mysql_select_db("test", $link);
// Wenn das Formular abgeschickt wurde
if ($_POST['submit']) {
// Wenn die Checkbox gesetzt wurde hat sie den value-Wert ansonsten ist sie leer und erhält eine 0 als Wert
if ($_POST['pin']) $pin = $_POST['pin'];
else $gpin = 0;
if ($_POST['int02']) $int02 = $_POST['int02'];
else $int02 = 0;
if ($_POST['int03']) $int03 = $_POST['int03'];
else $int03 = 0;
// Die UPDATE-Anweisung an die Datenbank
mysql_query("UPDATE $tabellenname SET int01 = '$pin', int02 = '$int02', int03 = '$int03' WHERE id = '$id'", $link);
}
// Datenbankabfrage
$sql = "SELECT int01, int02, int03 FROM $tabellenname WHERE id='$id'";
$result = mysql_query($sql, $link);
list($pin, $int02, $int03) = mysql_fetch_array($result);
?>
<!DOCTYPE html>
<html>
<head>
<title>ArduDome</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="../images/conference-room.png"/>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css" />
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
<link rel="stylesheet" href="ardudome.css" />
</head>
<body>
<div data-role="page" data-title="ArduDome" id="ardudome-page">
<div data-theme="d" data-role="header">
<h1>
ArduDome
</h1>
</div>
<div data-role="content">
<div class="content-primary">
<div class="s-title"><center>Outputs</center></div>
<ul data-role="listview" data-inset="true" >
<li>
<form action="index.php" method="post">
<input type="checkbox" name="int02" value="1" <?php if ($int02 == "1") echo "checked"; ?>/> Segeln
<input type="checkbox" name="int03" value="1" <?php if ($int03 == "1") echo "checked"; ?>/> Golf
<input type="submit" name="submit" value="Abschicken" />
</form>
</li>
<li>
<label for="P02"><b>OUT 02</b></label>
<select name="P02" id="P02" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P03"><b>OUT 03</b></label>
<select name="P03" id="P03" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P04"><b>OUT 04</b></label>
<select name="P04" id="P04" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P05"><b>OUT 05</b></label>
<select name="P05" id="P05" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P06"><b>OUT 06</b></label>
<select name="P06" id="P06" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P07"><b>OUT 07</b></label>
<select name="P07" id="P07" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P08"><b>OUT 08</b></label>
<select name="P08" id="P08" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P09"><b>OUT 09</b></label>
<select name="P09" id="P09" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P10"><b>OUT 10</b></label>
<select name="P10" id="P10" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P11"><b>OUT 11</b></label>
<select name="P11" id="P11" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P12"><b>OUT 12</b></label>
<select name="P12" id="P12" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
<li>
<label for="P13"><b>OUT 13</b></label>
<select name="P13" id="P13" data-mini="false" data-role="slider">
<option value="0">Off</option>
<option value="1">On</option>
</select>
</li>
</ul>
</div>
<div class="content-secondary">
<div class="s-title"><center>Inputs</center></div>
<?php print_r($result); ?>
<ul data-role="listview" data-inset="true" >
<li>
<label><b>IN A0</b></label>
<span class="inputvalue" name="P14" id="P14">0</span>
</li>
<li>
<label><b>IN A1</b></label>
<span class="inputvalue" name="P15" id="P15">0</span>
</li>
<li>
<label><b>IN A2</b></label>
<span class="inputvalue" name="P16" id="P16">0</span>
</li>
<li>
<label><b>IN A3</b></label>
<span class="inputvalue" name="P17" id="P17">0</span>
</li>
<li>
<label><b>IN A4</b></label>
<span class="inputvalue" name="P18" id="P18">0</span>
</li>
<li>
<label><b>IN A5</b></label>
<span class="inputvalue" name="P19" id="P19">0</span>
</li>
</ul>
</div>
<!-- <button id="test">Test</button> -->
</div>
<div data-theme="d" data-role="footer">
<h1>by Luca Soltoggio</h1>
</div>
</div>
<script src="ardudome.js"></script>
</body>
</html>
Editier mal das Passwort weg, ich schau mal eben drüber ....
hahahahaha ![]()
Danke für den Hinweis, ist eh nur für testzwecke. Werd wohl das ein und das andere mal den Raspi neu aufsetzen müssen, ich vergib meistens neues Passwort.
Hier ist ne gute Seite:
Also die Select Felder kannst du wie Checkboxen abfragen. Nur musst du erst einen Feld eintragen bevor du dieses Update kannst.
Pseudo-Code:
-> Select * FROM tabelle_xyz WHERE id=:id
-> if count result == 0
-> INSERT .....
-> else
-> UPDATE ... WHERE id = :id
-> SELECT .... wie gehabt
Ich muss da mit javascript arbeiten, da ich nicht jedes mal auf abschicken klicken will.
Das eintragen in die DB hab ich hinbekommen, nur das Updaten funzte nicht.
Wenn ich direkt zB P12 nehme, dann kann ich in die DB schreiben aber nicht Updaten.
Sitz schon ne Woche dran und nix hinbekommen. =(
Was heißt: In Db schreiben, aber nicht updaten
Also der Insert geht aber UPDATE nicht bei Sql
oder kommen die Daten nicht zurück. Welches Update genau ist gemeint ?
Update vom Umschalter, wenn in DB Wert 1 drin steht, ist der Umschalter auf off
Ah das ist auch nicht schwer wenn du die Werte ausgelesen hast:
<?php
$p03 = ... aus Datenbank auslesen mit Status 0 oder 1
?>
<label for="P03"><b>OUT 03</b></label>
<select name="P03" id="P03" data-mini="false" data-role="slider">
<option value="0" <?php if ($p03 == "0") echo "selected"; ?>>Off</option>
<option value="1"<?php if ($p03 == "1") echo "selected"; ?>>On</option>
</select>
Edit:
Abfrage angepasst
Funzt nicht. Wird nix in die DB eingetragen.
// Datenbankabfrage
$sql = "SELECT int01, int02, int03 FROM $tabellenname WHERE id='$id'";
$result = mysql_query($sql, $link);
list($P03, $int02, $int03) = mysql_fetch_array($result);
Hier wirds ja abgefragt.
Okay, nun läufts. Großschreibung nicht beachtet.