De code om afbeelding te uploaden

<?php				
if ( isset($_SESSION['username']) ) {
echo "<b><a>
  <form enctype='multipart/form-data' action='YourPhotos2.php?id=$id&&username=$username' method='post'>
  <input type='hidden' name='MAX_FILE_SIZE' value='99999999' />
  <div><input name='userfile' type='file' /></div>
  <div><input type='submit' value='Submit' /></div>
  </form>";
	}
else {
echo"";}?>

de code om het op te slaan in database:

<?php
    session_start(); ?>
<?php
if(isset($_GET['username']))
{ 
  $username = $_GET['username'];
  // getting info from db
}?>
<?php
if(isset($_GET['id']))
{ 
  $id = intval($_GET['id']);
  // getting info from db
}
?>
<?php
/*** check if a file was submitted ***/
if(!isset($_FILES['userfile']))
    {
    echo '<p>Please select a file</p>';
    }
else
    {
    try    {
        upload();
        /*** give praise and thanks to the php gods ***/
        echo '<p>Thank you for submitting</p>';
        }
    catch(Exception $e)
        {
        echo '<h4>'.$e->getMessage().'</h4>';
        }
    }
?><?php
/**
 *
 * the upload function
 * 
 * @access public
 *
 * @return void
 *
 */
function upload(){
/*** check if a file was uploaded ***/
if(is_uploaded_file($_FILES['userfile']['tmp_name']) && getimagesize($_FILES['userfile']['tmp_name']) != false)
    {
    /***  get the image info. ***/
    $size = getimagesize($_FILES['userfile']['tmp_name']);
    /*** assign our variables ***/
    $type = $size['mime'];
    $imgfp = fopen($_FILES['userfile']['tmp_name'], 'rb');
    $size = $size[3];
    $name = $_FILES['userfile']['name'];
    $maxsize = 99999999;


    /***  check the file is less than the maximum file size ***/
    if($_FILES['userfile']['size'] < $maxsize )
        {
        /*** connect to db ***/
        $dbh = new PDO("mysql:host=localhost;dbname=sfriends", 'root', 'superbart');

                /*** set the error mode ***/
                $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            /*** our sql query ***/
        $stmt = $dbh->prepare("INSERT INTO testblob (image_type ,image, image_size, image_name, user_id) VALUES (? ,?, ?, ?, ?)");

        /*** bind the params ***/
        $stmt->bindParam(1, $type);
        $stmt->bindParam(2, $imgfp, PDO::PARAM_LOB);
        $stmt->bindParam(3, $size);
        $stmt->bindParam(4, $name);
		$stmt->bindParam(5, $id);
        /*** execute the query ***/
        $stmt->execute();
        }
    else
        {
        /*** throw an exception is image is not of type ***/
        throw new Exception("File Size Error");
        }
    }
else
    {
    // if the file is not less than the maximum allowed, print an error
    throw new Exception("Unsupported Image Format!");
    }
}
?>

Maar als ik dat probeer geeft hij het volgende aan:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null.

Hoe kan dit?
Zowel die code die je volgens de site bovenaan de pagina moest zetten staat er als de code die je in PHP.ini moest plaatsen.
als er een parse error is, wordt het script niet gestart. In dat geval kun je dus niet met je script de error reporting aanzetten.

In dat geval moet je dus in php.ini, of gemakkelijker in .htaccess, de reporting aan zetten.
Als je voor php.ini kiest, moet je ook de server (apache) restarten.
<?php
$term = $_POST['term'];

if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username=$term")) {
$row = mysqli_fetch_assoc($result);
if ($row['COUNT(*)'] == 0) {
while($row = mysqli_fetch_array($result)) {
echo '<br/> First Name: '.$row['username'];
echo '<br/><br/>';
}
echo "";
}
}
else {
// no
// print status message
echo "No rows found!";
}
// free result set memory
mysqli_close($con);
?>

Beetje netter inspringen geeft meer inzicht/overzicht.

No rows found! is te zien als de query is mislukt.

Als $row['COUNT(*)'] == 0 ga je proberen om $row['username'] te laten zien.
Maar 0 is toch niks gevonden.
En username wordt niet opgehaald.
aangenomen dat username (en dus $term) een string is: er missen '' om $term in de query.

als je zoekt met een query waarbij username=x

dan hoef je niet uit $row[] te zoeken wat er in de db stond bij dat record voor username. dat namelijk $term (zij het eventueel hoofdletter ongevoelig, afhankelijk van je db settings.
De code is nu:


<?php
$term = $_POST['term'];
 
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username LIKE "%$term%"")) { 
    $row = mysqli_fetch_assoc($result);  
    if ($row['COUNT(*)'] == 1) {
    while($row = mysqli_fetch_array($result))      {
    echo "Je bent ingelogd als";
    }
}} 
else { 
    // no 
    // print status message 
    echo "No rows found!"; 
}
// free result set memory 
mysqli_close($con);
?>

Zowel in het geval van zonder als in geval van met If count = 1, krijg ik de volgende error:
Warning: Division by zero in .... on line 22.
lijn 22 is de mysqli query.

[size=xsmall]Toevoeging op 16/10/2015 15:16:38:[/size]

En ik ben erachter dat dat komt omdat hij niks met die specifieke username kan vinden.
Maar dat is raar want dat hoort hij wel te doen.
Mja kijk eens naar de code highlighting; het geheel moet nog steeds een tekst-string vormen he.

Maak er eens van:
<?php
...
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username LIKE '%".mysqli_real_escape_string($con, $term)."%'")) {
...
?>


Daarnaast kan een LIKE query best meerdere resultaten opleveren, dus waarom == 1?
En als je dan toch == 1 gebruikt, waarom dan een while, je hebt met == 1 altijd precies één resultaat...
Nu werkt hij opzich prima, maar wat ik nu wil is dat hij uit Users, de username haalt maar ook het bijbehorende id.
Nu lijkt mij dat dat kan met:

if ($result = mysqli_query($con,"SELECT id,username FROM users WHERE username LIKE '%".mysqli_real_escape_string($con, $term)."%'")) {


Maar wat moet dan hier

if ($row['COUNT(*)'] == 1) {

komen te staan ipv count. Want zet ik er een van de twee (id of username) dan werkt hij logischerwijs niet.
if(mysqli_num_rows($result) > 0)
// laat zien
else
// niks gevonden
Als je een EXACTE vergelijking wilt doen gebruik je WHERE ... A = 'B'.

Dit moet dan vervolgens PRECIES één resultaat opleveren. Dit kun je controleren door resultaten te tellen, dit doe je met mysqli_num_rows().
<?php
...
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username = '".mysqli_real_escape_string($con, $term)."'")) {
    if (mysqli_num_rows($result) == 1) {
        // disco
        ...
    }
    ...
}
?>

Ik zou als ik jou was jezelf aanleren de object georienteerde schrijfwijze van MySQLi te gebruiken, in plaats van de procedurele variant die je nu gebruikt.

Verder hoop ik dat je voorzieningen hebt ingebouwd die garanderen dat gebruikersnamen uniek zijn in je systeem, anders levert die query mogelijk meerdere resultaten op...

Reageren