Com definir variables com a numèriques – PHP – SitePoint Forums

Hola, tinc alguns problemes amb el meu codi. És per actualitzar el fitxer de pagament del compte a finals de mes. S’anoten els comentaris
al codi (//).
#1) com definir variables com a numèriques (he provat diversos exemples (fòrums i manuals)
#2) com sumar diverses variables juntes perquè es coneguin com a numèriques (totes són decimals 8,2 a la base de dades)
#3) Si us plau, algú expliqui la “variable no definida: mysql”.

";echo date('m/d/y');echo "
"; $due=0; $prevbal="prevbal"; $latechg="latechg"; $secdep="secdep"; $damage="damage"; $courtcost="courtcost"; $nsf="nsf"; $amtdue="amtdue"; $amtpaid="amtpaid"; $paidsum="paidsum"; $due = $prevbal + $latechg + $secdep + $damage + $courtcost + $nsf; // Warning: A non-numeric value encountered x 5 line 21 $amtdue = $amtdue + $due; Warning: // A non-numeric value encountered x 1 line 22 // if no payment or partial payment, add $10 to latechg field and amount not paid to prevbal field if ($amtpaid < $amtdue) // Notice: Undefined variable: amtpaid { $latechg = $latechg + 10; $prevbal = $amtdue - $amtpaid; } // if payment = amtdue clear due if ($amtpaid == $amtdue) // Notice: Undefined variable: amtpaid { $prevbal = 0; $latechg = 0; } // if over-payment subtract over-payment // from prevbal field if ($ampaid > $amtdue ) // Notice: Undefined variable: amtpaid { $amtdue = $amtpaid - $amtdue; $prevbal = 0; $latechg = 0; } $secdep = 0; $damage = 0; $courtcost = 0; $nsf = 0; // refresh every record - give every record the below values $amtpaid = '0.00'; $hudpay = '0.00'; $datepaid = ' '; $paidsum = '0.00'; $comments=" "; // Perform a query, check for error if (!$mysqli -> query("UPDATE payfile SET // Undefined variable: mysqli Fatal error: Uncaught Error: Call to a member function query() on null prevbal="$prevbal",latechg='$latechg', hudpay='$hudpay', amtpaid='$amtpaid', datepaid='$datepaid', comment="$comment", paidsum='$paidsum' where unit = $unit")); mysqli_query($sql) or die(mysql_error()); ?> these are error messages: Warning: A non-numeric value encountered in C:xampphtdocspropertyrefreshpayments.php on line 21 Warning: A non-numeric value encountered in C:xampphtdocspropertyrefreshpayments.php on line 21 Warning: A non-numeric value encountered in C:xampphtdocspropertyrefreshpayments.php on line 21 Warning: A non-numeric value encountered in C:xampphtdocspropertyrefreshpayments.php on line 21 Warning: A non-numeric value encountered in C:xampphtdocspropertyrefreshpayments.php on line 21 Warning: A non-numeric value encountered in C:xampphtdocspropertyrefreshpayments.php on line 21 Warning: A non-numeric value encountered in C:xampphtdocspropertyrefreshpayments.php on line 22 Notice: Undefined variable: ampaid in C:xampphtdocspropertyrefreshpayments.php on line 32 Notice: Undefined variable: mysqli in C:xampphtdocspropertyrefreshpayments.php on line 44 Fatal error: Uncaught Error: Call to a member function query() on null on line 44


Pel que fa a les variables no numèriques, la teniu configurada en una cadena aquí a la línia 11:

$courtcost="courtcost"; 

I els altres errors de mysql probablement provenen del fet que utilitzeu dos estils diferents de PHP (MySQLi Procedural per connectar-se i el que sembla MySQLi orientat a objectes per executar la consulta).

Quan executeu una consulta, heu d’utilitzar la variable de connexió ($link) i no una variable no definida ($mysqli).

Heu d’assegurar-vos que tot el codi de la vostra base de dades sigui del mateix tipus i que estigui configurat correctament amb les variables adequades. Consulta aquesta col·lecció d’articles per ajudar-te:

Crec que això està més a prop, els errors numèrics han desaparegut però els errors deixats es comenten al codi. Moltes gràcies pel teu consell.

";echo date('m/d/y');echo "
"; //connect to database $mysqli = new mysqli("localhost", "root", "", "prerentdb"); //check for errors if ($mysqli->connect_errno) { echo "Failed to connect to MySQL: " . $mysqli->connect_error; } //MySqli Select Query $res = $mysqli->query("SELECT * FROM payfile"); //fetch query $row = $res->fetch_assoc(); $due=0; //display results /* echo $row['amtdue']; echo $row['amtpaid']; echo $row['prevbal']; echo $row['latechg']; echo $row['secdep']; echo $row['damage']; echo $row['courtcost']; echo $row['nsf']; echo $row['paidsum']; echo $row['comments']; */ if ($result = $mysqli->query($sql)) { // Undefined variable: sql& Warning: Empty query while($obj = $result->fetch_object()){ $due = $obj->prevbal + $obj->latechg + $obj->secdep + $obj->damage + $obj->courtcost + $obj->NSF; $amtdue = $obj->amtdue + due; // do these need to be variables or can your code just use $obj? $prevbal =$obj->prevbal; $latechg = $obj->latechg; $secdep = $obj->secdep; $damage = $obj->damage; $courtcost = $obj->courtcost; $nsf = $obj->nsf; // if no payment or partial payment, add $10 to latechg field and amount not paid to prevbal field if ($amtpaid < $amtdue) { $latechg = $latechg + 10; $prevbal = $amtdue - $amtpaid; } // if payment = amtdue clear due if ($amtpaid == $amtdue) { $prevbal = 0; $latechg = 0; } // if over-payment subtract over-payment // from prevbal field if ($ampaid > $amtdue ) { $amtdue = $amtpaid - $amtdue; $prevbal = 0; $latechg = 0; } $secdep = 0; $damage = 0; $courtcost = 0; $nsf = 0; // refresh every record - give every record the below values $amtpaid = '0.00'; $hudpay = '0.00'; $datepaid = ' '; $paidsum = '0.00'; $comments=" "; // Perform a query, check for error if (!$mysqli -> query("UPDATE payfile SET prevbal="$prevbal",latechg='$latechg', hudpay='$hudpay', amtpaid='$amtpaid', datepaid='$datepaid', comment="$comment", paidsum='$paidsum' where unit = $ unit")); mysqli_query($sql) or die(mysql_error()); } } $result->close(); // Fatal error: Call to a member function close() on bool ?>

  1. Tu crides mysqli->query($sql); però no teniu cap variable anomenada $sql – el missatge d’error t’ho diu. Voleu fer una consulta aquí? Ja ho has executat select * from payfile i després va recuperar el primer resultat a $row unes línies més enrere. No hauríeu de fer un bucle entre aquests resultats en lloc d’executar una altra consulta? Si no, quin sentit tenia la primera consulta ja que no feu res amb els resultats?

  2. “La trucada d’error fatal a una funció membre close() en bool” és perquè la vostra consulta no s’ha executat a causa de l’error 1 i, per tant $result és false, no un punter de resultats. No es pot tancar una cosa que no s’ha obert en primer lloc. Poques vegades tanco objectes de resultats de totes maneres, perquè es tancaran automàticament quan finalitzi l’script. Si insistiu a tancar-lo, tanqueu-lo dins del vostre if() clàusula i només es tancarà si s’ha obert correctament.

  3. Han de ser variables o només puc utilitzar obj? – No té sentit crear variables per això, de manera que només podeu utilitzar el vostre objecte directament.

  4. mysqli_query($sql) or die (mysql_error()) – de nou, estàs intentant executar una consulta $sql quan no heu definit aquesta variable enlloc, així que un cop hàgiu corregit el primer error, en obtindreu un aquí. A continuació, feu servir l’antic, eliminat-de-l-últim-PHP mysql_error() tot i que la resta del codi està utilitzant mysqli. Voleu realment que el codi surti del bucle si una consulta falla a mig camí? Segur que voldríeu que continuï processant el bucle? Com que es tracta d’actualitzar els saldos, això comportarà tot tipus de problemes quan hàgiu de tornar a executar el codi.

En aquest bit:

// Perform a query, check for error
if (!$mysqli -> query("UPDATE payfile SET  
 prevbal="$prevbal",latechg='$latechg', hudpay='$hudpay', amtpaid='$amtpaid', 
datepaid='$datepaid', comment="$comment", paidsum='$paidsum' 
where unit = $ unit"));

quin és el sentit de la if() clàusula que envolta aquesta consulta? No tens cap else o qualsevol cosa condicional depenent de si la consulta s’ha executat. I on ho va fer $unit vinc de? No ho veig enlloc del teu codi. Crec que també hauríeu d’especificar-ho $unit més que com $ unitperò podeu solucionar-ho quan canvieu a Declaracions preparades.

Si sagneu el codi de manera coherent, seria molt més fàcil de llegir. També heu de mirar les declaracions preparades en lloc de concatenar variables a la consulta així.

Estic segur que he vist aquest codi aquí abans.



2 m’agrada

És l’exercici de la classe de programació ‘pagament de lloguer’.

@ckguitarz, no hauríeu d’actualitzar la quantitat en una taula per fer-ho. Hauríeu d’INSERIR una nova fila de dades per a cada transacció +/- que afecti un valor, i després SUM() les quantitats en una consulta SQL per obtenir el saldo actual en qualsevol moment. Al final del mes, quan calculeu qualsevol càrrec per retard per a tots els registres, INSERIREU una nova fila amb l’import del càrrec per retard per a qualsevol número d’unitat (compte) on els pagaments siguin inferiors a l’import a pagar. A més, en comptes de repartir els diferents tipus d’imports en diferents columnes, tindríeu una única columna type_id i també una taula de base de dades que conté les dades d’identificador/nom de definició de tipus.



1 M’agrada

Estic bastant d’acord, mantenir els totals sense cap transacció és una cosa dolenta en la comptabilitat, i mantenir tots dos significa que finalment no estaran d’acord. Només heu de mantenir les transaccions i sumar-les segons calgui.



1 M’agrada

Leave a Comment

Your email address will not be published. Required fields are marked *